为什么是运算符?:如果第二个或第三个参数抛出表达式,则失去左值性? 在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;}@但这个案例目前还有效,唯一的问题是初始化一个引用。