三元运算的结果(类型)是什么?

时间:2017-02-22 15:04:41

标签: c++ ternary-operator

三元操作是否返回副本或引用?

我检查了以下代码

vector<int> v0 = { 1, 2 };
vector<int> v1 = { 3 };

vector<int>& v = true ? v0 : v1;
v.clear(); // v0 will be cleared also

我认为三元操作会返回v0的副本。然后将其传递给v。因此vv0具有不同的数据存储。测试没有显示出来。

谢谢,Kerrek SB!我添加一个&#34;应该没有编译&#34;示例(感谢WhiZTiM!)来说明这一点。

vector<int>& v = true ? v0 : vector<int>{3};
v.clear(); // v0 will not be cleared

2 个答案:

答案 0 :(得分:15)

条件表达式的类型是操作数的常见类型。

但我认为你实际上并不感兴趣。重要的是条件表达式的值类别是什么。

如果两个操作数都是或者可以转换为公共类型的左值,则条件表达式是左值;否则它是一个rvalue(可能需要对其中一个操作数进行左值到右值的转换)。

答案 1 :(得分:2)

找到规则here: 与你的表达相关:

E1 ? E2 : E3
  

4)如果E2和E3是相同类型和相同值的glvalues   类别,然后结果具有相同的类型和值类别,并且是   如果E2和E3中的至少一个是位域,则为位字段。

在你的情况下:

true ? v0 : v1;

v0v1lvalues(广义glvalue)。 因此,返回将是左值 v0。因此,您的表达式将等同于:

vector<int>& v = v0;

关于修改

vector<int>& v = true ? v0 : vector<int>{3};
v.clear(); // v0 will not be cleared

Should not compile,因为结果的值类别为rvalue,您无法将非const引用绑定到rvalue