为什么第一个返回引用?
int x = 1;
int y = 2;
(x > y ? x : y) = 100;
而第二个没有?
int x = 1;
long y = 2;
(x > y ? x : y) = 100;
实际上,第二个根本没有编译 - “不是左值赋值”。
原文由 Yola 发布,翻译遵循 CC BY-SA 4.0 许可协议
为什么第一个返回引用?
int x = 1;
int y = 2;
(x > y ? x : y) = 100;
而第二个没有?
int x = 1;
long y = 2;
(x > y ? x : y) = 100;
实际上,第二个根本没有编译 - “不是左值赋值”。
原文由 Yola 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答3.3k 阅读
表达式没有返回类型,它们有一个类型和 - 正如最新的 C++ 标准中所知道的 - 一个值类别。
条件表达式可以是 左值 或 _右值_。这是它的价值范畴。 (这有点简化,在
C++11
我们有左值、xvalue 和 prvalue。)在非常广泛和简单的术语中, 左值 指的是内存中的对象,而 右值 只是一个可能不一定附加到内存中的对象的值。
赋值表达式为对象赋值,因此被赋值的事物必须是 _左值_。
对于条件表达式 (
?:
) 要成为 _左值_(同样,广义和简单的术语), 第二 个和第三个操作数必须是相同类型 的左值。这是因为条件表达式的类型和值类别是在编译时确定的,并且无论条件是否为真都必须是适当的。如果必须将其中一个操作数转换为不同的类型以匹配另一个,则条件表达式不能是 _左值_,因为此转换的结果不会是 _左值_。