带有 void 操作数的 C++ 条件运算符

Posted

技术标签:

【中文标题】带有 void 操作数的 C++ 条件运算符【英文标题】:C++ conditional operator with void operand(s) 【发布时间】:2018-01-28 14:17:23 【问题描述】:

我试图理解 C++ 标准(ISO/IEC 14882:2003,较新的版本基本相同)的以下摘录:

5.16 条件运算符

2 如果第二个或第三个操作数的类型(可能是 cv 限定的)void,则左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换在第二个执行 和第三个操作数,...

我倾向于认为在这种情况下,当操作数是函数调用时,操作数的类型被认为是(尽管不是)函数返回类型。如果是这样,那么就会产生一个 void 类型的示例。

我还认为,在这种情况下,也可以推测 throw 表达式具有 void 类型,与 throw 操作数的类型无关。那将是另一个例子。

我的两个假设对吗?还有其他情况吗? 非常感谢

【问题讨论】:

【参考方案1】:

关于 throw,是的,没有结果,所以类型为 void 与 throw 操作数的类型无关。我不确定它是如何相关的,所以这个问题看起来很奇怪。

关于函数,如果操作数是函数调用,我不知道为什么你说操作数的类型不是函数返回类型。还会是什么?它是操作数是函数(与函数调用相反)的地方,函数到指针的转换将开始。

条件运算符的结果类型取决于其操作数的类型。 我认为围绕其中一个操作数为 void 的特殊语言只是条件运算符的结果为 void,因此有关可能执行不同类型操作数转换的规则无关紧要。

【讨论】:

我说的是因为函数的类型是由它所接受的参数、它的返回值和任何 cv 限定符(8.3.5 函数)构成的。因此,函数指针的类型为其添加了“指针”限定条件。如果只考虑返回,那么两个指向采用不同参数并返回相同类型的函数的指针将属于相同类型。灾难。但似乎,在这个运算符的上下文中,函数是否返回 void 的事实才是最重要的(我的意思是,在我引用的段落中)

以上是关于带有 void 操作数的 C++ 条件运算符的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中对布尔值使用位运算符

C 和 C++ 之间的条件运算符区别

C++ 条件运算符

具有范围解析和条件的 C++ 三元运算符

带有条件编译的 c++ 标头包含顺序

C ++中的运算符逗号?:条件