Почему [[nodiscard]] только побуждает компилятор выдавать предупреждение и не требует его?
[[nodiscard]]
атрибут введен в стандарте C++17, а в случае
... потенциально оцениваемое выражение отброшенного значения,..., реализациям рекомендуется выдавать предупреждение в таких случаях.
Источник: n4659, C++17 окончательный рабочий проект.
Аналогичная формулировка используется при cppreference, что в случае "нарушения":
компилятору рекомендуется выдавать предупреждение.
Почему слово " поощряется" используется вместо обязательного? Существуют ли ситуации (кроме явного приведения к void
) когда компилятору лучше не выдавать предупреждение? В чем причина смягчения стандартного языка в конкретном случае относительно безопасного требования выдавать предупреждение, несмотря ни на что (опять же, за исключением, скажем, явного приведения к недействительности)?
1 ответ
Стандарт C++ определяет поведение допустимой программы C++. При этом он также определяет, что означает "действительная программа C++".
Диагностика требуется только для некорректно сформированного кода, синтаксически или семантически неверного кода (и даже в этом случае существуют некоторые некорректно сформированные обстоятельства, которые не требуют диагностики). Либо код правильно сформирован, либо он плохо сформирован и (обычно) отображается диагностика.
Таким образом, сама идея "предупреждения" не является чем-то, что стандарт C++ распознает или должен распознавать. Обратите внимание, что даже "реализациям рекомендуется выдавать предупреждение" в ненормативной записи, а не в законной спецификации поведения.