为什么 [[nodiscard]] 只鼓励编译器发出警告而不要求它?

Why does [[nodiscard]] only encourage compiler to issue a warning and does not require it?

C++17标准中引入的[[nodiscard]]属性,如果是

... potentially-evaluated discarded-value expression,..., implementations are encouraged to issue a warning in such cases.

来源:n4659, C++17 final working draft.

cppreference 上使用了类似的措辞,在 "violation" 的情况下:

the compiler is encouraged to issue a warning.

为什么使用鼓励而不是要求?是否存在编译器最好不发出警告的情况(除了显式转换为 void)?在相对安全的要求发出警告的特定情况下软化标准语言的原因是什么(再次,除了,比如说,显式强制转换为 void)?

C++ 标准规定了有效 C++ 程序的行为。这样一来,它还定义了 "valid C++ program" 的含义。

只有格式错误的代码、语法或语义上不正确的代码才需要诊断(即便如此,也有一些格式错误的情况不需要诊断)。代码要么格式正确,要么格式错误并且(通常)显示诊断信息。

所以 "warning" 的概念不是 C++ 标准所识别的东西,或者 意味着 可以识别。请注意,即使 "implementations are encouraged to issue a warning" 语句也是非规范的表示法,而不是合法的行为规范。