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

时间:2014-10-12 19:02:02

标签: c++ casting void

我知道你可以压制“没有效果的表达”警告将表达式转换为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用法的完整图片,以及标准指定的行为/语义。

1 个答案:

答案 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>(())