经常使用的语句,例如(void)x;
允许抑制有关未使用变量的警告x
。但是如果我尝试编译以下内容,我会得到一些我不太理解的结果:
int main()
{
int x;
(short)x;
(void)x;
(int)x;
}
用 g++ 编译它,我收到以下警告:
$ g++ test.cpp -Wall -Wextra -o test
test.cpp: In function ‘int main()’:
test.cpp:4:13: warning: statement has no effect [-Wunused-value]
(short)x;
^
test.cpp:6:11: warning: statement has no effect [-Wunused-value]
(int)x;
^
所以我的结论是投射到void
与转换为任何其他类型有很大不同,目标类型与decltype(x)
或不同的东西。我对可能的解释的猜测是:
- 这只是一个约定
(void)x;
但其他演员不会抑制警告。所有的陈述同样没有任何作用。
- 这种差异在某种程度上与以下事实有关:
void x;
不是一个有效的语句short x;
is.
如果有的话,哪一个更正确?如果没有,那么如何解释编译器警告的差异?
强制转换为 void 用于抑制编译器警告。这Standard https://cplusplus.github.io/CWG/issues/1054.html§5.2.9/4 中说,
任何表达式都可以显式转换为类型“cv void”。这
表达式值被丢弃。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)