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]]
bar()
发出了警告,因此,虽然不发出警告不是错误,但gcc 6.2中缺少了更多的功能
C++17的[[nodiscard]]
行为是否也一样
这也是实现定义的。[dcl.attr.nodiscard]中的标准中有一个非规范性注释:
外观
不鼓励将nodiscard调用作为一个可能经过计算的废弃值表达式(第5条),除非明确
使无效在这种情况下,鼓励实施发出警告。这通常是因为
丢弃nodiscard调用的返回值会产生令人惊讶的后果
在这种情况下,实现不需要发出警告。但他们可能会这样做 我认为这是一个错误。但我不知道作者的意图是什么。问题是,如果稍微修改返回对象的类,行为可能会从一个构建更改到下一个构建。我不知道怎么会有人觉得这是可取的。你的项目无法控制的库对象呢?QoI代表什么?实施质量(胡乱猜测)?@Kane Yep。猜对了。