void() 是有效的 C++ 表达式吗?

pet*_*cja 17 c++ expression void

显然,这个三元表达式void()作为一个参数编译:

void foo() {}

//...
a == b ? foo() : void();
Run Code Online (Sandbox Code Playgroud)

标准是void()一个有效的表达式,还是只是一个编译器的东西?如果它是有效的,那么它是一种什么样的表达方式?

Nat*_*ica 20

void()是一个有效的表达式并产生一个类型为 的纯右值void。在 C++ 20 中,这将扩展为还包括void{}. 相关部分是[expr.type.conv]/2

如果初始值设定项是带括号的单个表达式,则类型转换表达式等效于相应的强制转换表达式。否则,如果类型是cv void并且初始化程序是(){}(在包扩展之后,如果有),则表达式是不执行初始化的指定类型的纯右值。否则,表达式是指定类型的纯右值,其结果对象是用初始化程序直接初始化的。如果初始值设定项是带括号的可选表达式列表,则指定的类型不应是数组类型。


Nut*_*ker 5

除了其他答案,从这里

void - 带有空值集的类型。它是无法完成的不完整类型(因此,不允许使用 void 类型的对象)。没有 void 数组,也没有对 void 的引用。但是,允许指向 void 和返回类型 void 的函数(其他语言中的过程)。

这意味着您可以将 void 类型初始化为任何值,a == b ? foo() : void(1)或者a == b ? foo() : void(1111)它不会执行任何操作并且仍然可以成功编译。