我知道你可以压制"表达无效"警告将表达式转换为void:
int main()
{
void(2+3);
}
Run Code Online (Sandbox Code Playgroud)
如果我没有错,那么将某些内容转换为void的意思不是将表达式转换为类型的对象void(void是一个没有对象的类型,或者更好地说是一个空集),但告诉我们想要的编译器忽略该值的表达.其他相关样本:
int main()
{
(void)(2+3);
}
Run Code Online (Sandbox Code Playgroud)
这个与另一个样本之间有任何语义差异吗?
最后:
int main()
{
void();
}
Run Code Online (Sandbox Code Playgroud)
它不返回警告(这里是Coliru 测试,充满了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'
Run Code Online (Sandbox Code Playgroud)
这个void()表达的含义是什么?您是在创建一个void没有意义的临时对象类型吗?或者您是否将空表达式转换为void?
一般来说,我想了解有关void的用法的完整图片,以及哪个行为/语义是标准指定的那个.
这void(2+3)不是强制转换,它是伪构造函数.是的,void(2+3)和之间存在语义差异(void)(2+3).void(2+3)是一个隐式演员的结构,如:void((void)(2+3)).void()虽然使用伪default-constructor而不是伪拷贝构造函数,但它也是一个合法的伪构造.
是void()的本质上是创建一个类型的临时void(虽然你说你实际上不能有void类型的对象,所以你永远不能用它做任何事情;它不能作为参数传递,分配给变量等.)
转换对表达式进行操作:对表达式进行(void) (2+3)操作(2+3).但这()不是法律表达,因此(void)()不合法.同样你不能做static_cast<void>()或static_cast<void>(()).