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

Is void() a valid C++ expression?

本文关键字:C++ 表达式 一个 void 有效      更新时间:2023-10-16

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

void foo() {}
//...
a == b ? foo() : void();

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

void()是一个有效的表达式,并生成类型void的 prvalue 。 在 20 C++中,这将扩展到也包括void{}. 与此相关的部分是 [expr.type.conv]/2

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

除了其他答案,从这里:

void- 使用一组空值键入。这是一个不完整的类型, 无法完成(因此,类型为 void 的对象是 不允许(。没有 void 数组,也没有对 void 的引用。 但是,指向 void 的指针和返回类型 void 的函数 (其他语言的程序(是允许的。

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