David 的 回答几乎涵盖了这样做的动机,明确地向其他“开发人员”表明,你知道这个函数返回,但是你明确地忽略了它。
这是一种确保在必要的错误代码总是得到处理的方法。
我认为对于 C + + 来说,这可能是唯一一个我更喜欢使用 C 风格强制转换的地方,因为在这里使用完整的静态强制转换符号感觉有点过头了。最后,如果你正在审查一个编码标准或者正在编写一个,那么明确地声明对重载操作符的调用(不使用函数调用表示法)也应该免除这一点也是一个好主意:
class A {};
A operator+(A const &, A const &);
int main () {
A a;
a + a; // Not a problem
(void)operator+(a,a); // Using function call notation - so add the cast.
main.cpp: In function ‘int main()’:
main.cpp:6:6: warning: ignoring return value of ‘int f()’, declared with attribute nodiscard [-Wunused-result]
6 | f();
| ~^~
main.cpp:1:19: note: declared here
1 | [[nodiscard]] int f() {
|
以下内容均可避免警告:
(void)f();
[[maybe_unused]] int i = f();
我无法在 f()呼叫中直接使用 maybe_unused:
[[maybe_unused]] f();
提供:
main.cpp: In function ‘int main()’:
main.cpp:6:5: warning: attributes at the beginning of statement are ignored [-Wattributes]
6 | [[maybe_unused]] f();
| ^~~~~~~~~~~~~~~~
在 [[nodiscard]]标准化之前,在 C 最终决定标准化属性之前,GCC 用 warn_unused_result实现了完全相同的功能:
int f() __attribute__ ((warn_unused_result));
int f() {
return 1;
}
int main() {
f();
}
它给出了:
main.cpp: In function ‘int main()’:
main.cpp:8:6: warning: ignoring return value of ‘int f()’, declared with attribute warn_unused_result [-Wunused-result]
8 | f();
| ~^~
需要注意的是,由于 ANSI C 没有这方面的标准,ANSI C 没有指定哪些 C 标准库函数具有这个属性,因此实现自己决定哪些应该标记为 warn_unuesd_result,这就是为什么一般情况下你必须使用 (void)强制转换来忽略对标准库函数的任何调用的返回,以完全避免在任何实现中出现警告。