在了解价值类别的同时,我发现以下代码片段编译并运行得很好:
#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 类别和具有相同的类型,结果是该类型和值 如果第二个或第三个操作数是a,则它是一个位字段 位字段,或两者都是位字段。
鉴于x
和y
都是左值(因此是glvalues),两种情况下条件表达式的结果都是左值。在此基础上,表达似乎是有效的。然而,尚不清楚这是否会产生任何影响。
我不确定条件语句是否应该生效的原因是因为第二个和第三个操作数类型的类型是int
。即使此结果int
是左值,也不意味着它必须引用x
或y
。它本质上可能是一个虚拟变量,导致无效,并且符合标准。换句话说,我认为没有理由将其解析为int&
而不是单独的int
。
我的问题是......
这种行为是否正确?为什么?
我事先看过this question,但不相信它回答了我的问题。这个问题的答案是指较旧的标准,使用不同的措辞,并且不回答我关于结果是否为int&
到x
的问题。