为什么第一个条件运算符会产生引用?
int x = 1;
int y = 2;
(x > y ? x : y) = 100;
然而,第二个却没有。
int x = 1;
long y = 2;
(x > y ? x : y) = 100;
实际上,第二个根本无法编译:
error: lvalue required as left operand of assignment
| (x > y ? x : y) = 100;
| ~~~~~~~^~~~~~~~
表达式没有返回类型,它们有一个类型和——正如最新的 C++ 标准中所知的——一个值类别。
条件表达式可以是lvalue or an rvalue。这是它的价值类别。 (这有点简化,C++11
我们有左值、x值和纯右值。)
用非常广泛和简单的术语来说,lvalue指的是内存中的一个对象和一个rvalue只是一个不一定附加到内存中对象的值。
赋值表达式将一个值赋给一个对象,因此被赋值的对象必须是一个lvalue.
对于条件表达式 (?:
)成为一个lvalue(再次,用广泛而简单的术语来说),第二个和第三个操作数必须是lvalues同类型的。这是因为条件表达式的类型和值类别是在编译时确定的,并且无论条件是否为真,都必须适当。如果其中一个操作数必须转换为不同的类型以匹配另一个操作数,则条件表达式不能是lvalue因为这种转换的结果不会是lvalue.
ISO/IEC 14882:2011 参考文献:
3.10 [basic.lval] 左值和右值(关于值类别)
5.15 [expr.cond] 条件运算符(条件表达式具有什么类型和值类别的规则)
5.17 [expr.ass] 赋值和复合赋值运算符(要求赋值的 l.h.s. 必须是可修改的左值)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)