【发布时间】:2016-11-11 15:38:51
【问题描述】:
如果他/她不保存某个函数的返回值,我想警告用户,但如果该函数返回一个具有非默认析构函数的类,则它不起作用。
假设以下代码:
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 ]]的行为是否相同?
【问题讨论】:
-
我认为这是一个错误。但我不知道
GCC作者的意图。这样做的问题是,如果稍微修改返回对象的类,行为可能会从一个构建更改为下一个构建。我看不出有人会觉得那是可取的。你的项目无法控制的库对象呢?
标签: c++ g++ language-lawyer