为什么运算符?:如果第二个或第三个参数抛出表达式,则丢失左值?

max*_*huk 3 c++

在C++运算符中?:如果第二个和第三个参数是相同类型的左值,则可以是左值,例如:

int foo = 0, bar = 1;
bool condition = true;
(condition ? foo : bar) = 42; // correct
Run Code Online (Sandbox Code Playgroud)

还可以在此运算符中抛出一些内容:

bar = (condition ? foo : throw 42); // still correct
Run Code Online (Sandbox Code Playgroud)

但是这段代码没有编译,因为左表达式不是左值:

(condition ? foo : throw 42) = bar; // compile error
Run Code Online (Sandbox Code Playgroud)

我在C++标准中检查了这个事实,并阅读:

第二个或第三个操作数(但不是两个)是一个throw-expression(15.1); 结果是另一个的类型,是一个右值.

这个规则有什么解释?

dyp*_*dyp 5

这是CWG缺陷1560.引用缺陷报告:

无论条件表达式如何使用,作为条件表达式的一个操作数出现的glvalue (其中另一个操作数是throw-expression)将被转换为prvalue:[...]这似乎是无偿的,令人惊讶的.

这由CWG 1550的分辨率确定,现在[expr.cond] /2.1表示:

[If]第二个或第三个操作数(但不是两个)是一个(可能带括号的)throw-expression ; 结果是另一个的类型和值类别.

所以它应该适用于最近的编译器.