c++ - '?:' 的返回类型(三元条件运算符)

标签 c++ types reference conditional-operator lvalue

为什么第一个返回引用?

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/

相关文章:

c++ - 返回相同值的随机数生成器(C++)

c++ - 在构造一个定义了某个大类型的基类成员的派生类时,我应该如何传递值?

Scala: "Genericising"超过单例类型?

haskell - 操作类型构造函数的参数顺序

variables - 什么类型的变量包含一个范围?

java - 维基百科上的这段左派树代码正确吗?

methods - 在没有引用的情况下调用子切片上的方法

C++ 使用 std::function 和 std::bind 不调用函数委托(delegate)给成员函数

java - 在*定义之前无法引用字段“错误

c++ - 我将 Sprite 添加到 CCArray,但如何通过 CCObject 获取其成员,如 getPosition()?