【发布时间】:2014-10-12 19:02:02
【问题描述】:
我知道您可以禁止将表达式转换为无效的“表达式无效”警告:
int main()
{
void(2+3);
}
如果我没记错的话,将某些东西转换为 void 的含义并不是将表达式转换为 void 类型的对象(void 是一个没有对象的类型,或者更好地说,是一个空集),但是告诉编译器我们要忽略表达式的值。其他相关示例:
int main()
{
(void)(2+3);
}
这个样本和其他样本之间有什么语义差异吗?
最后:
int main()
{
void();
}
不返回任何警告(这里是 Coliru test,充满了 pedantic.related 选项);但是,这会产生错误:
int main()
{
(void)();
}
// Error:
// main.cpp:6:9: error: expected primary-expression before 'void'
// (void)();
// ^
// main.cpp:6:9: error: expected ')' before 'void'
void() 表达式的含义是什么?您是在创建一个没有意义的 void 类型的临时对象吗?还是将一个空表达式转换为 void?
总的来说,我想了解有关 void 使用的完整情况,以及标准指定的行为/语义。
【问题讨论】:
-
请注意,标准(至少,不是在 C 中,不能确定 C++)不需要此诊断;这只是编译器作者有帮助。因此,您不会在标准中找到任何解决此问题的内容。
-
@OliverCharlesworth 谢谢。我会用你的评论更新我的问题。
-
" 但是,这会产生错误" - 问题中没有错误。如果 yiu 提到错误,请同时发布!
-
事实上,
(void)unused_arg是关闭特定函数中未使用参数的警告的常用方法,如果您仍希望此类警告出现在其他地方。 -
例如,gcc 表示
-Wunused-value:To suppress this warning cast the unused expression to ‘void’.。