如果第二个或第三个参数抛出表达式,则失去左值

Why operator ?: lost lvalue-ness if second or third argument is throwing expression?

本文关键字:表达式 失去 参数 三个 第二个 如果      更新时间:2023-10-16

在c++中,如果第二个和第三个参数是相同类型的左值,操作符?:可以是左值,例如:

int foo = 0, bar = 1;
bool condition = true;
(condition ? foo : bar) = 42; // correct

也可以在这个操作符中抛出一些东西:

bar = (condition ? foo : throw 42); // still correct

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

(condition ? foo : throw 42) = bar; // compile error

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

第二个或第三个操作数(但不是两个)是抛出表达式(15.1);是一个右值

这个规则的解释是什么?

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

作为条件表达式的一个操作数出现的全局值另一个操作数是的抛出表达式转换为右值,不管条件表达式如何使用:[…]这似乎是不必要的和令人惊讶的。

这是修正了CWG 1550的分辨率,现在[expr.cond]/2.1说:

[If]第二个或第三个操作数(但不是两个)是(可能的)括号)抛出表达式;结果是另一个的类型和值类别

throw的优先级低于?:=。你实际上在说的是

condition ? foo : throw (42 = bar);

显然42不能作为右值赋值。

来源:http://en.cppreference.com/w/cpp/language/operator_precedence

(答案指原问题的语法…)