在学习值类别时,我发现以下代码段编译并运行得很好:
#include <iostream>
int main() {
int x = 1;
int y = 2;
(true ? x : y) = 4;
std::cout << x << std::endl;
}
这是输出:
4
首先,我检查了这个语句是否合法 C++,我认为是因为以下原因:
N4296 5.16.4 条件运算符 [expr.cond]
如果第二个和第三个操作数是相同值类别的glvalues并且具有相同类型,则结果是该类型和值类别,并且如果第二个或第三个操作数是位域,则它是位域,或者如果两者都是位域。
鉴于x
和y
都是左值(因此也是左值),两种情况下条件表达式的结果都是左值。在此基础上,该表达似乎是有效的。然而,尚不清楚这是否应该有任何影响。
我不确定条件语句是否应该起作用的原因是因为第二个和第三个操作数类型的类型是int
. 即使这个结果int
是一个左值,也不意味着它必须引用x
or y
。它本质上可能是一个虚拟变量,不会产生任何影响,并且符合标准。换句话说,我认为没有理由将其解析为一个int&
而不是一个单独的int
.
我的问题是...
这种行为是否正确,为什么?
我事先看了一下这个问题,但不相信它回答了我的问题。这个问题的答案是指一个较旧的标准,有不同的措辞,并且不回答我关于结果是否为int&
to的问题x
。