说我有

[[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]]值”?

最佳答案

WG14 nodiscard proposal讨论了通过强制转换为无效来使诊断静音的原理。它说强制转换为void是鼓励(如果不是非规范的)将其静音的方法,该方法遵循现有实现对__attribute__((warn_unused_result))的操作:



C++方式为static_cast<void>

参见C++标准草案[[dcl.attr.nodiscard]p2:



这是一个说明,因此不是规范性的,但基本上这是现有实现对__attribute__((warn_unused_result))所做的工作。另外,请注意,nodiscard的诊断也是非规范的,因此,违反nodiscard的诊断不是错误的形式,而是实现质量,就像通过强制转换为空来抑制一样。

参见clang document on nodiscard, warn_unused_result:

关于c++ - 如何有意丢弃[[nodiscard]]返回值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53581744/

10-13 06:44