Педантичное предупреждение gcc: введите спецификаторы на функциональном типе возврата

Я - ведущий разработчик в системе управления документооборотом предприятия, в которой некоторые клиенты хранят сотни гигабайтов документов. Терабайты в не слишком отдаленном будущем. Мы используем файловая система подход по многим причинам, упомянутым на этой странице плюс другой: архивация.

Многие наши клиенты должны приспособить промышленности определенным архивным правилам, таким как устройство хранения данных на оптический диск или устройство хранения данных в несобственническом формате. Плюс, у Вас есть гибкость простого добавления большего количества дисков к устройству NAS. Если Вам сохранили Ваши файлы в Вашей базе данных, даже с потоковым типом данных файла 2008 SQL Server, Ваши архивные опции просто стали намного более узкими.

67
задан Seth Johnson 15 July 2009 в 21:38
поделиться

4 ответа

Это не нарушает стандарт. Вот почему они предупреждения , а не ошибки .

И действительно, вы правы - ведущая const лишняя. Компилятор предупреждает вас, потому что вы добавили код, который в других обстоятельствах может что-то значить, но в этом случае ничего не значит, и он хочет убедиться, что вы не разочаруетесь позже, когда ваши возвращаемые значения окажутся в конце концов изменяемыми.

93
ответ дан 24 November 2019 в 14:39
поделиться

Я столкнулся с этим предупреждением при компиляции кода, использующего Boost.ProgramOptions. Я использую -Werror , поэтому предупреждение убивало мою сборку, но поскольку источник предупреждения находился в глубине Boost, я не смог избавиться от него, изменив свой код.

После долгих поисков Я нашел параметр компилятора, который отключает предупреждение:

-Wno-ignored-qualifiers

Надеюсь, это поможет.

19
ответ дан 24 November 2019 в 14:39
поделиться

Скотт Мейерс указал, что существует довольно веская причина, по которой кто-то захочет вернуть значения 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 .

-5
ответ дан 24 November 2019 в 14:39
поделиться

Имея этот

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 ++ предупреждает об игнорировании классификатора, но не игнорирует его. Я думаю, предупреждение касается пользователей, которые берут копию и игнорируют константные классификаторы в своей копии. Но это не должно быть предупреждением, потому что это абсолютно правильное поведение. И это имеет смысл.

2
ответ дан 24 November 2019 в 14:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: