为什么这个C++表达式不会产生警告?

Per*_*-lk 2 c++ casting void

我知道你可以压制"表达无效"警告将表达式转换为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的用法的完整图片,以及哪个行为/语义是标准指定的那个.

bam*_*s53 5

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>(()).