Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ gnu::如果返回类具有析构函数,则忽略warn_unused_result属性_C++_G++_Language Lawyer - Fatal编程技术网

C++ gnu::如果返回类具有析构函数,则忽略warn_unused_result属性

C++ gnu::如果返回类具有析构函数,则忽略warn_unused_result属性,c++,g++,language-lawyer,C++,G++,Language Lawyer,我想警告用户,如果他/她没有保存某个函数的返回值,但如果该函数返回一个具有非默认析构函数的类,则该函数不起作用 假设以下代码: struct A {}; struct B { ~B() {} }; [[ gnu::warn_unused_result ]] A foo() { return A{}; } [[ gnu::warn_unused_result ]] B bar() { return B{}; } int main() { foo(); // warning b

我想警告用户,如果他/她没有保存某个函数的返回值,但如果该函数返回一个具有非默认析构函数的类,则该函数不起作用

假设以下代码:

struct A {};
struct B { ~B() {} };

[[ gnu::warn_unused_result ]]
A foo() { return A{}; }

[[ gnu::warn_unused_result ]]
B bar() { return B{}; }

int main()
{
    foo(); // warning
    bar(); // no warning
    return 0;
}
使用g++6.2.1编译时,只有
foo()
生成警告:

$ g++ -Wall -Wextra ./test.cpp 
./test.cpp: In function ‘int main()’:
./test.cpp:13:9: warning: ignoring return value of ‘A foo()’, declared with attribute warn_unused_result [-Wunused-result]
     foo();
         ^
我理解调用
B
的析构函数可能被视为“结果的使用”,但问题是:

  • 这是预期的行为还是g++中的错误/特性
  • 在这种情况下,有没有办法强制编译器发出警告
  • C++17的
    [[nodiscard]]
    行为是否也一样
这是预期的行为还是g++中的错误/特性

这是一个QoI问题,所有类似的警告也是如此。gcc 7确实对
bar()
发出了警告,因此,虽然不发出警告不是错误,但gcc 6.2中缺少了更多的功能

C++17的
[[nodiscard]]
行为是否也一样

这也是实现定义的。[dcl.attr.nodiscard]中的标准中有一个非规范性注释:

外观 不鼓励将nodiscard调用作为一个可能经过计算的废弃值表达式(第5条),除非明确 使无效在这种情况下,鼓励实施发出警告。这通常是因为 丢弃nodiscard调用的返回值会产生令人惊讶的后果


在这种情况下,实现不需要发出警告。但他们可能会这样做

我认为这是一个错误。但我不知道作者的意图是什么。问题是,如果稍微修改返回对象的类,行为可能会从一个构建更改到下一个构建。我不知道怎么会有人觉得这是可取的。你的项目无法控制的库对象呢?QoI代表什么?实施质量(胡乱猜测)?@Kane Yep。猜对了。