为什么clang-tidy建议在任何地方添加[[nodiscard]]?
我有一个 C++ 项目,clang-tidy建议在[[nodiscard]]任何地方添加。这是一个好习惯吗?我的理解是,[[nodiscard]]只有在忽略返回值对程序可能是致命的时才应该使用。我有一个对象Car,它有一个成员const unsigned int m_ID。吸气剂应该unsigned int getID()有[[nodiscard]]吗?clang-tidy 建议如此。
编辑:
当然,我不想忽略吸气剂。但
我的观点是,如果每个返回内容的函数都应该有一个[[nodiscard]],那么该属性[[nodiscard]]无论如何都是多余的。编译器可以简单地检查所有返回内容的函数。
回答
这个选项显然是“modernize-use-nodiscard”,所以如果你愿意,你可以停用它。
应当指出的是,规则,该选项轮廓是不是规则的C ++标准委员会自己使用何时应用[[nodiscard]]。这些规则是:
应在以下位置添加:
- 对于现有的 API
- 不使用返回值总是一个“巨大的错误”(例如总是导致资源泄漏)
- 不使用返回值是一个麻烦的来源,很容易发生(不明显,有什么问题)
- 对于新的 API(尚未在 C++ 标准中)
- 不使用返回值通常是一个错误。
在以下情况下不应添加:
- 对于现有的 API
- 至少对于某些输入,不使用返回值是一种可能/常见的编程方式
- 例如对于 realloc(),当新站点 [sic] 为 0 时,它的行为就像 free
- 不使用返回值没有意义,但不会造成伤害,而且通常不是错误(例如,因为程序员打算要求状态更改)。
- 它是一个 C 函数,因为它们的声明可能不受 C++ 实现的控制
这就是为什么像operator neware这样的函数[[nodiscard]]而像optional::value不是这样的函数的原因。你的代码有一个小错误和你的代码从根本上被破坏是有区别的。[[nodiscard]]就委员会而言,是后者。
请注意,容器empty方法是一种特殊情况。他们似乎符合“不使用[[nodiscard]]”的格局,但由于名字的empty相似的名称clear,如果你不使用的返回值empty,赔率是好的,你的意思打电话clear。
显然,这不能仅从声明中得知,因此 Clang-Tidy 无法实现所述规则。