为什么是运算符?:如果第二个或第三个参数抛出表达式,则失去左值性? 在C++运算符中,p>:如果第二和第三参数是相同类型的值,则可以是一个左值,例如: int foo = 0, bar = 1; bool condition = true; (condition ? foo : bar) = 42; // correct

为什么是运算符?:如果第二个或第三个参数抛出表达式,则失去左值性? 在C++运算符中,p>:如果第二和第三参数是相同类型的值,则可以是一个左值,例如: int foo = 0, bar = 1; bool condition = true; (condition ? foo : bar) = 42; // correct,c++,C++,此外,还可以在该操作符中抛出某些内容: bar = (condition ? foo : throw 42); // still correct 但此代码无法编译,因为左表达式不是左值: (condition ? foo : throw 42) = bar; // compile error 我在C++标准中检查这个事实,读到: 第二个或第三个操作数(但不是两者)是抛出表达式 (15.1); 结果为另一种类型,为右值 对此规则有何解释?throw的优先级低于?:和=。你的意思是 条件?foo

此外,还可以在该操作符中抛出某些内容:

bar = (condition ? foo : throw 42); // still correct
但此代码无法编译,因为左表达式不是左值:

(condition ? foo : throw 42) = bar; // compile error
我在C++标准中检查这个事实,读到:

第二个或第三个操作数(但不是两者)是抛出表达式 (15.1); 结果为另一种类型,为右值


对此规则有何解释?

throw
的优先级低于
?:
=
。你的意思是

条件?foo:投掷(42=杆)

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

资料来源:

(答案是指原始问题的语法…

这是。引用缺陷报告:

在中作为条件表达式的一个操作数出现的值 另一个操作数是抛出表达式的操作数转换为 prvalue,无论如何使用条件表达式:[……] 这似乎是无缘无故和令人惊讶的

这一点已通过决议得到解决,现在[expr.cond]/2.1说:

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


因此,它应该与最新的编译器配合使用。

条件?foo:bar=42是否为<代码>状态?foo:(bar=42)。谢谢,我添加了大括号。我的问题仍然是实际的。@dyp是的,看起来这在C++14中是固定的。如果条件为真,结果是
foo=bar
。但是如果它为false,将导致
抛出42=bar
。对不起,我忘记了大括号。现在我修正了这个问题并添加了它们。我认为OP的问题很明显,他在语法上犯了错误,这可以在评论中提到,但在回答中没有提到。作为一名程序员,我要求任何人都不要使用这个。我喜欢这是一个编译错误@MobyDisk它在成员初始化列表中很有用,例如:struct SomeStruct{SomeStruct(intx):m_x(x>0?x:throw“error”){}intm_x;}@但这个案例目前还有效,唯一的问题是初始化一个引用。