隐式转换为左值参考

Nic*_*ick 4 c++ language-lawyer c++11

我正在看标准的5.16第3段,试图了解发生了什么.考虑M定义为的类型

struct M {
  M();
  M(const M&);
  M(M&&);
};
Run Code Online (Sandbox Code Playgroud)

如果我有一个三元表达pred ? E1 : E2,其中的类型E1IS const M&和类型E2就是M&&确实5.16第3段子弹1适用?

- 如果E2是左值:如果E1可以被隐式转换(第4节)到类型"左值引用T2",则E1可以被转换为匹配E2,受制于转换中引用必须直接绑定的约束(8.5. 3)到左值.

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

如果它是隐式可转换的,M&&直接绑定到const M&?我经历了8.5.3中的程序,我认为第5段子弹2是这个案例所在的地方,所以它确实直接绑定,但我不确定.

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

Bri*_*ian 5

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

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

如果初始化表达式-是一个x值(但不是一个位域),类prvalue,阵列prvalue或功能左值和" CV1 T1 "是参考兼容" CV2 T2 ",...

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

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