如何解决为什么 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",so you can deactivate that if you prefer。
应该注意的是,此选项概述的规则不是 C++ 标准委员会自己用于何时应用 [[nodiscard]]
的规则。 Those rules being:
应该添加到:
- 对于现有的 API
- 不使用返回值总是一个“巨大的错误”(例如总是导致资源泄漏)
- 不使用返回值是一个麻烦的根源,并且很容易发生(并不明显表明出了什么问题)
- 对于新的 API(尚未在 C++ 标准中)
- 不使用返回值通常是一个错误。
在以下情况下不应添加:
- 对于现有的 API
- 不使用返回值是一种可能/常见的编程方式,至少对于某些输入
- 例如 realloc(),当新站点 [sic] 为 0 时,它就像 free 一样
- 不使用返回值是没有意义的,但不会造成伤害,而且通常不是错误(例如,因为程序员打算请求状态更改)。
- 它是一个 C 函数,因为它们的声明可能不受 C++ 实现的控制
- 不使用返回值是一种可能/常见的编程方式,至少对于某些输入
这就是为什么像 operator new
这样的函数是 [[nodiscard]]
而像 optional::value
这样的函数不是。你的代码有一个小错误和你的代码从根本上被破坏是有区别的。 [[nodiscard]]
,就委员会而言,是后者。
请注意,容器 empty
方法是一种特殊情况。它们似乎符合“不使用 [[nodiscard]]
”的模式,但是因为 empty
的 name 与 clear
的名称相似,如果您不使用如果不使用 empty
的返回值,您有意调用 clear
的可能性很大。
显然,这不能仅从声明中得知,因此 Clang-Tidy 无法实现上述规则。
,为什么 clang-tidy 建议在任何地方添加 [[nodiscard]]?
clang-tidy 不建议添加 [[nodiscard]] 无处不在。建议的情况在检查的 documentation 中描述。
这是一个好习惯吗?
是的,当丢弃结果可能是一个错误时,使用 [[nodiscard]] 是一个好习惯。这种情况经常发生。
getter unsigned int getID() 应该有 [[nodiscard]] 吗?
你能想象在不使用返回值的情况下调用 getter 会很有用的任何用例吗?如果您确定这种情况不存在,那么您应该使用 [[nodiscard]]。我认为在描述的例子中不存在这种情况。
我的理解是 [[nodiscard]] 应该只在忽略返回值对程序来说可能是致命的时使用。
这是一个相当保守的理解。如果您不同意,可以禁用相关检查。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。