说我有
[[nodiscard]] int foo ()
{
return 0;
}
int main ()
{
foo ();
}
然后
error: ignoring return value of ‘int foo()’, declared with attribute nodiscard [-Werror=unused-result]
但如果
int x = foo ();
然后
error: unused variable ‘x’ [-Werror=unused-variable]
有没有一种干净的方式告诉编译器“我想丢弃这个 [[nodiscard]]
值”?
原文由 spraff 发布,翻译遵循 CC BY-SA 4.0 许可协议
WG14 nodiscard 提案 讨论了通过将诊断设置为无效来使诊断静音的基本原理。它说强制转换为 void 是鼓励(如果非规范)使其静音的方法,这遵循现有实现对
__attribute__((warn_unused_result))
的作用:C++ 方式是
static_cast<void>
。请参阅 C++ 标准草案 [[ dcl.attr.nodiscard]p2 :
这是一个注释,因此不规范,但基本上这是现有实现对
__attribute__((warn_unused_result))
所做的事情。此外,请注意 nodiscard 的诊断也是非规范性的,因此违反 nodiscard 的诊断不是格式错误的,而是执行质量,就像通过强制转换为 void 进行抑制一样。请参阅 nodiscard 上的 clang 文档 warn_unused_result :