【问题标题】:Implicit conversion to lvalue reference隐式转换为左值引用
【发布时间】: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,我已经相应地更新了问题。
  • 表达式没有引用类型。你的意思是E1const M 类型的左值,E2M 类型的xvalue。这会改变你的问题吗?
  • “可以隐式转换”在 [conv]p3 中定义。它比仅仅寻找转换运算符更广泛。在这种情况下,const M& x = std::declval<M&&>(); 格式正确,因此M&&(或M 类型的xvalue)可以隐式转换为const M&

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


【解决方案1】:

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

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

如果初始化表达式 — 是一个 xvalue(但不是位域)、类纯右值、数组纯右值或函数左值和“cv1 T1” 与“cv2 T2”引用兼容,...

而不是最后一种涉及临时构造的情况,即间接绑定情况。

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

【讨论】:

  • 所以对于const M constMM m,表达式false ? constM : std::move(m) 将采用m,将其转换为const M 类型的左值,然后将其转换为类型的纯右值const M。最后,将进入第 6 段,其中临时结果(const M 类型的纯右值)被复制初始化,在这种情况下将调用复制构造函数?
  • @Nick 是的,这是我的阅读,所以它应该调用复制构造函数两次:一次执行左值到右值的转换,一次初始化条件表达式的结果。但我的解释可能不正确。
猜你喜欢
  • 2018-08-06
  • 2014-01-17
  • 2017-02-17
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
相关资源
最近更新 更多