我知道你可以压制“没有效果的表达”警告将表达式转换为void:
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用法的完整图片,以及标准指定的行为/语义。
答案 0 :(得分:5)
这个void(2+3)
不是演员,它是伪构造函数。是的,void(2+3)
和(void)(2+3)
之间存在语义差异。 void(2+3)
是一个隐式转换的结构,如:void((void)(2+3))
。 void()
也是一个合法的伪结构,但是使用伪默认构造函数而不是伪复制构造函数。
是void()
本质上是创建一个void
类型的临时(虽然你说你实际上可以拥有无效类型的对象,所以你永远不能对它做任何事情;它不能作为参数传递,分配给变量等。)
强制转换对表达式进行操作:(void) (2+3)
对表达式(2+3)
进行操作。但()
不是法律表达,因此(void)()
不合法。同样,您无法执行static_cast<void>()
或static_cast<void>(())
。