为什么第一个返回引用?
int x = 1;
int y = 2;
(x > y ? x : y) = 100;
而第二个没有?
int x = 1;
long y = 2;
(x > y ? x : y) = 100;
实际上,第二个根本没有编译 - “不是赋值左值”。
最佳答案
表达式没有返回类型,它们有一个类型和——正如最新的 C++ 标准中所知道的——一个值类别。
条件表达式可以是左值 或右值。这是它的值(value)范畴。 (这有点简化,在 C++11
中我们有左值、xvalues 和 prvalues。)
在非常广泛和简单的术语中,左值 指的是内存中的对象,右值 只是一个不一定附加到内存中的对象的值.
赋值表达式为对象赋值,因此被赋值的对象必须是左值。
要使条件表达式 (?:
) 成为左值(同样,用广义和简单的术语来说),第二个和第三个操作数必须是 < em>左值 相同类型。这是因为条件表达式的类型和值类别是在编译时确定的,并且无论条件是否为真都必须是适当的。如果其中一个操作数必须转换为不同的类型以匹配另一个,则条件表达式不能是左值,因为此转换的结果将不是左值。
ISO/IEC 14882:2011 references:
3.10 [basic.lval] Lvalues and rvalues (about value categories)
5.15 [expr.cond] Conditional operator (rules for what type and value category a conditional expression has)
5.17 [expr.ass] Assignment and compound assignment operators (requirement that the l.h.s. of an assignment must be a modifiable lvalue)
关于c++ - '?:' 的返回类型(三元条件运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29176092/