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

Why doesn't this C++ expression generate even a warning?

本文关键字:警告 C++ 表达式 为什么      更新时间:2023-10-16

我知道你可以取消"expression without effect"警告,将表达式强制转换为void:

int main()
{
    void(2+3);
}

如果我没有错的话,将某物强制转换为void的意思不是将表达式强制转换为void类型的对象(void是一个没有对象的类型,或者更好地说,是一个空集),而是告诉编译器我们希望忽略表达式的值。其他相关样品:

int main()
{
    (void)(2+3);
}

这个样本和另一个样本在语义上有什么区别?

最后:

int main()
{
    void();
}

它没有返回任何警告(这里是Coliru测试,充满了与学究相关的选项);然而,另一个会产生一个错误:

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用法的全貌,以及标准规定的行为/语义是什么。

这个void(2+3)不是强制转换,它是一个伪构造函数。是的,void(2+3)(void)(2+3)之间存在语义差异。void(2+3)是一个隐式类型转换的构造,类似于:void((void)(2+3))void()也是一个合法的伪构造,尽管它有一个伪默认构造函数而不是一个伪复制构造函数。

是的,void()本质上是创建一个类型为void的临时对象(尽管正如您所说,您实际上不能拥有void类型的对象,所以您永远不能对它做任何事情;它不能作为参数传递,也不能分配给变量,等等)

强制转换操作表达式:(void) (2+3)操作表达式(2+3)。但是()不是一个合法的表达,所以(void)()是不合法的。同样,您不能执行static_cast<void>()static_cast<void>(())