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

新手上路,请多包涵

为什么第一个返回引用?

 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 许可协议

阅读 613
2 个回答

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

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

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

赋值表达式为对象赋值,因此被赋值的事物必须是 _左值_。

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

ISO/IEC 14882:2011 参考:

3.10 [basic.lval] 左值和右值(关于值类别)

5.15 [expr.cond] 条件运算符(条件表达式具有什么类型和值类别的规则)

5.17 [expr.ass] 赋值和复合赋值运算符(要求赋值的 lhs 必须是可修改的左值)

原文由 CB Bailey 发布,翻译遵循 CC BY-SA 4.0 许可协议

三元 ?: 表达式的类型是其第二个和第三个参数的常用类型。如果两种类型相同,您将获得一个参考。如果它们可以相互转换,则选择一个并转换另一个(在这种情况下提升)。由于您不能返回对临时(转换/提升的变量)的左值引用,因此它的类型是值类型。

原文由 Xeo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题