Answers:
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.
在工作中,我们使用它来确认该函数具有返回值,但是开发人员断言可以忽略它。由于您将问题标记为C ++,因此应该使用static_cast:
static_cast<void>(fn());
就编译器而言,将返回值强制转换为void几乎没有意义。
强制转换void
为用于针对未使用的变量和未保存的返回值或表达式禁止编译器警告。
标准(2003)在§5.2.9/ 4中说,
任何表达式都可以显式转换为“ cv void”类型。表达式值将被丢弃。
所以你可以这样写:
//suppressing unused variable warnings
static_cast<void>(unusedVar);
static_cast<const void>(unusedVar);
static_cast<volatile void>(unusedVar);
//suppressing return value warnings
static_cast<void>(fn());
static_cast<const void>(fn());
static_cast<volatile void>(fn());
//suppressing unsaved expressions
static_cast<void>(a + b * 10);
static_cast<const void>( x &&y || z);
static_cast<volatile void>( m | n + fn());
所有表格均有效。我通常将其简称为:
//suppressing expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);
也可以。
从c ++ 17开始,我们有了[[maybe_unused]]
可以代替void
投射使用的属性。
nodiscard
了可能感兴趣的内容:stackoverflow.com/a/61675726/895245另外,我认为您不能[[maybe_unused]]
直接将其应用于似乎是的调用,而不能仅应用于接受该调用返回的虚拟变量?如果那是正确的话,那有点不知所措。
对于您的程序而言,将功能强制转换为空是没有意义的。我还要指出,您不应该使用它来向正在阅读代码的人发信号,就像大卫回答中所建议的那样。如果您想传达有关您的意图的信息,最好使用评论。添加这样的演员表只会看起来很奇怪,并引起有关可能原因的疑问。只是我的观点...
For the functionality of you program casting to void is meaningless
对于自我记录和编译时的警告数量,实际上并非如此。当代码说明自己时,you should not use it to signal something to the person that is reading the code [...] it is better to use a comment.
最好的注释是no comment。并且,再次使有效警告编译器满意。
C ++ 17 [[nodiscard]]
C ++ 17使用属性对“返回值忽略业务”进行了标准化。
因此,我希望合规的实现将始终仅在nodiscard
给出给定的情况下发出警告,而从不发出其他警告。
例:
main.cpp
[[nodiscard]] int f() {
return 1;
}
int main() {
f();
}
编译:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -o main.out main.cpp
结果:
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();
我无法maybe_unused
直接在f()
通话中使用:
[[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();
| ^~~~~~~~~~~~~~~~
该(void)
投的工作似乎并没有强制性,但“鼓励”的标准:我怎么能故意丢弃[nodiscard]返回值?
同样从警告消息中可以看出,警告的一种“解决方案”是添加-Wno-unused-result
:
g++ -std=c++17 -ggdb3 -O0 -Wall -Wextra -pedantic -Wno-unused-result -o main.out main.cpp
尽管我当然不建议像这样在全球范围内忽略警告。
C ++ 20还允许您添加一个原因nodiscard
,[[nodiscard("reason")]]
如下所述:https : //en.cppreference.com/w/cpp/language/attributes/nodiscard
GCC warn_unused_result
属性
在标准化之前[[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)
强制转换来忽略对标准库函数的任何调用的返回,以完全避免任何实施中的警告。
已在GCC 9.2.1,Ubuntu 19.10中测试。