Я - ведущий разработчик в системе управления документооборотом предприятия, в которой некоторые клиенты хранят сотни гигабайтов документов. Терабайты в не слишком отдаленном будущем. Мы используем файловая система подход по многим причинам, упомянутым на этой странице плюс другой: архивация.
Многие наши клиенты должны приспособить промышленности определенным архивным правилам, таким как устройство хранения данных на оптический диск или устройство хранения данных в несобственническом формате. Плюс, у Вас есть гибкость простого добавления большего количества дисков к устройству NAS. Если Вам сохранили Ваши файлы в Вашей базе данных, даже с потоковым типом данных файла 2008 SQL Server, Ваши архивные опции просто стали намного более узкими.
Это не нарушает стандарт. Вот почему они предупреждения , а не ошибки .
И действительно, вы правы - ведущая const
лишняя. Компилятор предупреждает вас, потому что вы добавили код, который в других обстоятельствах может что-то значить, но в этом случае ничего не значит, и он хочет убедиться, что вы не разочаруетесь позже, когда ваши возвращаемые значения окажутся в конце концов изменяемыми.
Я столкнулся с этим предупреждением при компиляции кода, использующего Boost.ProgramOptions. Я использую -Werror
, поэтому предупреждение убивало мою сборку, но поскольку источник предупреждения находился в глубине Boost, я не смог избавиться от него, изменив свой код.
После долгих поисков Я нашел параметр компилятора, который отключает предупреждение:
-Wno-ignored-qualifiers
Надеюсь, это поможет.
Скотт Мейерс указал, что существует довольно веская причина, по которой кто-то захочет вернуть значения const
. Вот пример:
int some_calculation(int a, int b) { int res = 0; /* ... */ return res; }
/* Test if the result of the calculation equals 40.*/
if (some_calculation(3,20) = 40)
{
}
Вы понимаете, что я сделал не так? Этот код абсолютно правильный и должен компилироваться. Проблема в том, что компилятор не понял, что вы намеревались сравнить вместо присвоения значения 40
.
С возвращаемым значением const
приведенный выше пример не компилируется. Ну, по крайней мере, если компилятор не отбрасывает ключевое слово const
.
Имея этот
struct Foo {Foo (int) {} operator bool () {return true; }};
и что
Foo some_calculation (int a, int b) {Foo result (a + b); /*...*/ вернуть результат; }
пример
if (some_calculation (3, 20) = 40) {/*...*/}
компилируется без предупреждения. Конечно, такое бывает редко. Но разве константная правильность не заставляет людей делать что-то неправильно? И, ожидая, что люди будут пробовать что-то неправильное, возвращаемый тип должен быть объявлен как const. И: g ++ предупреждает об игнорировании классификатора, но не игнорирует его. Я думаю, предупреждение касается пользователей, которые берут копию и игнорируют константные классификаторы в своей копии. Но это не должно быть предупреждением, потому что это абсолютно правильное поведение. И это имеет смысл.