void() 是一个有效的C++表达式吗?
Is void() a valid C++ expression?
显然,这个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)
但它不会执行任何操作,并且仍然可以成功编译。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- 即使使用调试编译标志,表达式也是"optimized out"
- holeMenuProgram.cpp:38:1 错误:'}'令牌之前的预期主表达式
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 这 4 个 lambda 表达式之间有什么区别?