隐式转换为左值参考

时间:2016-02-01 19:52:53

标签: c++ c++11 language-lawyer

我正在查看标准的5.16第3段,试图了解正在发生的事情。考虑定义为

的类型export SYNCTL=$HOME/reponame
M

如果我有三元表达式struct M { M(); M(const M&); M(M&&); }; ,其中pred ? E1 : E2的类型为E1const M&的类型为E2,则为5.16第3段子弹1申请?

  

- 如果E2是左值:如果可以将E1隐式转换(第4条),则可以将E1转换为匹配E2   键入“对T2的左值引用”,受限于转换中引用必须绑定的约束   直接(8.5.3)到左值。

我认为它没有,因为要隐式转换为M&&,这需要const M&拥有成员函数M。 但是,我不确定,因为它可以隐式转换为operator const M&(),是否可以隐式添加引用?

如果它是隐式可兑换的,const M会直接绑定到M&&吗? 我完成了8.5.3中的程序,我认为第5段子弹2是这个案例所在的地方,因此它直接绑定,但我不确定。

  

- 如果初始化表达式[..]具有类类型(即T2是类类型),其中T1与T2不是引用相关的,并且可以是   隐式转换为类型为“cv3 T3”的xvalue,类prvalue或函数lvalue,其中   “cv1 T1”与“cv3 T3”参考兼容

1 个答案:

答案 0 :(得分:5)

您没有M&&类型的表达式,而是将其调整为类型为M xvalue。

所以问题是:如果你有一个类型为M的xvalue,它是否可以隐式转换为const M的左值引用?答案是肯定的,因为可以使用rvalue初始化const左值引用。这种参考绑定是直接的,因为它属于以下情况:

  

如果是初始化表达式    - 是xvalue(但不是位字段),类prvalue,数组prvalue或函数lvalue和“ cv1 T1”   与“ cv2 T2”,...

引用兼容

而不是涉及构造临时的最后一个案例,这是间接约束案例。

因此,条件运算符的这种使用将是良好的。类型M的xvalue将转换为const M类型的左值。然后将应用左值到右值的转换,结果将是const M类型的prvalue。