【发布时间】:2016-02-01 19:52:52
【问题描述】:
我正在查看标准 5.16 第 3 段,试图了解发生了什么。考虑将类型 M 定义为
struct M {
M();
M(const M&);
M(M&&);
};
如果我有一个三元表达式pred ? E1 : E2,其中E1 的类型是const M&,E2 的类型是M&&,5.16 第 3 段第 1 条是否适用?
——如果 E2 是一个左值:如果 E1 可以隐式转换(第 4 条)到 输入“对 T2 的左值引用”,受制于在转换中引用必须绑定的约束 直接 (8.5.3) 到左值。
我认为没有,因为要隐式转换为const M&,这需要M 具有成员函数operator const M&()。
但是,我不确定,因为可以隐式转换为const M,是否可以隐式添加引用?
如果它是隐式可转换的,M&& 是否直接绑定到const M&?
我在 8.5.3 中完成了程序,我认为第 5 段第 2 项是这种情况的落脚点,所以它确实直接绑定,但我不确定。
——如果初始化表达式 [..] 具有类类型(即 T2 是类类型),其中 T1 与 T2 没有引用相关,并且可以是 隐式转换为“cv3 T3”类型的 xvalue、类纯右值或函数左值,其中 “cv1 T1”与“cv3 T3”引用兼容
【问题讨论】:
-
T的定义是什么? -
抱歉,
T应该是M,我已经相应地更新了问题。 -
表达式没有引用类型。你的意思是
E1是const M类型的左值,E2是M类型的xvalue。这会改变你的问题吗? -
“可以隐式转换”在 [conv]p3 中定义。它比仅仅寻找转换运算符更广泛。在这种情况下,
const M& x = std::declval<M&&>();格式正确,因此M&&(或M类型的xvalue)可以隐式转换为const M&。
标签: c++ c++11 language-lawyer