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

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

本文关键字:警告 nodiscard 为什么 编译器      更新时间:2023-10-16

C++17 标准中引入的[[nodiscard]]属性,在

。潜在评估的丢弃值表达式,...,鼓励实现在这种情况下发出警告。

资料来源:n4659,C++17 最终工作草案。

在cpp 首选项中使用了类似的措辞,在"违规"的情况下:

建议编译器发出警告。

为什么使用">鼓励"一词而不是必需的词?是否存在编译器最好不要发出警告的情况(显式强制转换为void除外(?在相对安全的特定情况下,软化标准语言的原因是什么,即无论如何都要发出警告(同样,除了,例如,明确无效(?

C++ 标准指定有效C++程序的行为。在这样做时,它还定义了"有效C++程序"的含义。

只有格式不正确的代码、语法或语义不正确的代码才需要诊断(即使这样,也有一些格式不正确的情况不需要诊断(。代码格式正确,或者格式不正确,并且(通常(显示诊断。

因此,"警告"的概念并不是C++标准所承认的,或者意味着要承认的。请注意,即使是"鼓励实现发出警告"语句也是非规范表示法,而不是合法的行为规范。