显然,这个三目运算符可以编译通过,其中一个参数是 void()
:
void foo() {}
//...
a == b ? foo() : void();
void()
在标准中是有效的表达式,还是只是编译器的一种东西?如果它是有效的,那么它属于哪种类型的表达式?
显然,这个三目运算符可以编译通过,其中一个参数是 void()
:
void foo() {}
//...
a == b ? foo() : void();
void()
在标准中是有效的表达式,还是只是编译器的一种东西?如果它是有效的,那么它属于哪种类型的表达式?
void()
是一个有效的表达式,产生一个 void
类型的 prvalue。在 C++ 20 中,这将被扩展以包括 void{}
。相关章节可参见[expr.type.conv]/2
如果初始化程序是一个括号括起来的单个表达式,则类型转换表达式等同于相应的强制类型转换表达式。否则,如果类型为
cv void
并且初始化程序为()
或{}
(如果有任何包扩展),则该表达式是指定类型的 prvalue,不执行任何初始化。否则,该表达式是指定类型的 prvalue,其结果对象使用初始化程序进行直接初始化。如果初始化程序是带圆括号的可选表达式列表,则指定类型不得是数组类型。
a == b ? foo() : void(1)
或a == b ? foo() : void(1111)
,但是它不会执行任何操作并且仍然能够成功编译。
if(a==b){ foo(); }
更清晰,而且具有相同的效果。 - Cássio Renanvoid
类型的对象。(尽管我会第一个说,我不能想到一个并不意味着它不存在) - Cássio Renanvoid()
作为参数传递。 - Cássio Renan