【问题标题】:Why does [[nodiscard]] only encourage compiler to issue a warning and does not require it?为什么 [[nodiscard]] 只鼓励编译器发出警告而不要求它?
【发布时间】:2019-12-18 04:33:23
【问题描述】:

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

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

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

cppreference 使用了类似的措辞,以防“违规”:

鼓励编译器发出警告。

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

【问题讨论】:

  • C++ 中是否需要 any 警告?
  • @JohnZwinck 非常好。这可能是标准中选择与鼓励\不鼓励警告相关的语言的原因。但现在我显然有一个更笼统的问题。
  • 这样做的一件事是允许实现忽略该属性。标准委员会使用的指导方针是,在不改变语义(优化除外)的情况下属性应该可以忽略。

标签: c++ c++17 standards nodiscard wording


【解决方案1】:

C++ 标准规定了有效 C++ 程序的行为。这样做,它还定义了“有效的 C++ 程序”的含义。

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

因此,“警告”的概念并不是 C++ 标准所承认的,或者是意味着要承认的。请注意,即使是“鼓励实现发出警告”声明也是一种非规范性符号,而不是合法的行为规范。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 2011-01-28
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多