如果第二个或第三个参数抛出表达式,则失去左值
Why operator ?: lost lvalue-ness if second or third argument is throwing expression?
在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
(答案指原问题的语法…)
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- 即使使用调试编译标志,表达式也是"optimized out"
- holeMenuProgram.cpp:38:1 错误:'}'令牌之前的预期主表达式
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 如果第二个或第三个参数抛出表达式,则失去左值