我正在查看标准的5.16第3段,试图了解正在发生的事情。考虑定义为
的类型export SYNCTL=$HOME/reponame
M
如果我有三元表达式struct M {
M();
M(const M&);
M(M&&);
};
,其中pred ? E1 : E2
的类型为E1
且const 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”参考兼容
答案 0 :(得分:5)
您没有M&&
类型的表达式,而是将其调整为类型为M
的 xvalue。
所以问题是:如果你有一个类型为M
的xvalue,它是否可以隐式转换为const M
的左值引用?答案是肯定的,因为可以使用rvalue初始化const左值引用。这种参考绑定是直接的,因为它属于以下情况:
如果是初始化表达式 - 是xvalue(但不是位字段),类prvalue,数组prvalue或函数lvalue和“ cv1
引用兼容T1
” 与“ cv2T2
”,...
而不是涉及构造临时的最后一个案例,这是间接约束案例。
因此,条件运算符的这种使用将是良好的。类型M
的xvalue将转换为const M
类型的左值。然后将应用左值到右值的转换,结果将是const M
类型的prvalue。