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;

实际上,第二个根本没有编译——“not lvalue left of assignment”。

最佳答案

表达式没有返回类型,它们有一个类型和 - 正如最新的 C++ 标准中所知道的 - 一个值类别。

条件表达式可以是左值右值。这是它的值(value)范畴。 (这有点简化,在 C++11 中我们有左值、xvalue 和 prvalue。)

在非常广泛和简单的术语中,lvalue 是指内存中的对象,而 rvalue 只是一个可能不一定附加到内存中的对象的值.

赋值表达式为一个对象赋值,所以被赋值的东西必须是一个左值

要使条件表达式 (?:) 成为 左值(同样,广义和简单的术语),第二个和第三个操作数必须是 <同类型的 em>左值。这是因为条件表达式的类型和值类别是在编译时确定的,并且无论条件是否为真都必须是适当的。如果必须将其中一个操作数转换为不同的类型以匹配另一个,则条件表达式不能是 lvalue,因为此转换的结果不会是 lvalue

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/8535226/

相关文章:

java - java和c++中的多维数组有什么区别?

c++ - 取消引用并通过引用返回

c++ - C++模块之间的头文件依赖

c++ - 使用 -Wpedantic : "style of line directive is a GCC extension" 编译 .cu 时出现警告

clojure - 在 Clojure 中,何时应该使用记录或向量来表示异构节点类型的树?

python - 分配一个空列表使其变为 bool 值?

c# - 为什么 "int + string"在静态类型的 C# 中可能,但在动态类型的 Python 中却不行?

C++ 何时以及如何使用 std::iterator value_type、引用、指针?

java - 即使使用复制构造函数,克隆对象也会更改原始对象

c++ - 是否有必要为没有动态资源的类实现 move 构造函数?