Почему [[nodiscard]] только побуждает компилятор выдавать предупреждение и не требует его?

[[nodiscard]] атрибут введен в стандарте C++17, а в случае

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

Источник: n4659, C++17 окончательный рабочий проект.

Аналогичная формулировка используется при cppreference, что в случае "нарушения":

компилятору рекомендуется выдавать предупреждение.

Почему слово " поощряется" используется вместо обязательного? Существуют ли ситуации (кроме явного приведения к void) когда компилятору лучше не выдавать предупреждение? В чем причина смягчения стандартного языка в конкретном случае относительно безопасного требования выдавать предупреждение, несмотря ни на что (опять же, за исключением, скажем, явного приведения к недействительности)?

1 ответ

Решение

Стандарт C++ определяет поведение допустимой программы C++. При этом он также определяет, что означает "действительная программа C++".

Диагностика требуется только для некорректно сформированного кода, синтаксически или семантически неверного кода (и даже в этом случае существуют некоторые некорректно сформированные обстоятельства, которые не требуют диагностики). Либо код правильно сформирован, либо он плохо сформирован и (обычно) отображается диагностика.

Таким образом, сама идея "предупреждения" не является чем-то, что стандарт C++ распознает или должен распознавать. Обратите внимание, что даже "реализациям рекомендуется выдавать предупреждение" в ненормативной записи, а не в законной спецификации поведения.

Другие вопросы по тегам