【问题标题】:Is const T& rf = lvalue of T an identity conversion?const T& rf = lvalue of T 是身份转换吗?
【发布时间】:2020-02-19 12:43:14
【问题描述】:
T t;
const T& rf = t; // #1

考虑上面显示的初始化#1。是身份转换吗?换句话说,rf 是否直接绑定到初始化表达式?如果不是,#1 有多少标准转换,这些转换的名称是什么?

【问题讨论】:

  • #2 在哪里?
  • @Ayxan no #2,我只是想了解一些关于 #1 的事情
  • @mfnx 这里没有重载决议...
  • “身份转换”的概念仅用于重载解析。
  • @L.F.你能解释一下identity conversion吗,标准对这个概念没有明确说明

标签: c++ language-lawyer overload-resolution


【解决方案1】:

这是一种身份转换。 [over.ics.ref]/1:

当引用类型的参数直接绑定到参数表达式时,隐式转换序列就是恒等式 转换, 除非参数表达式的类型是 参数类型的派生类,在这种情况下隐式 转换序列是派生到基础的转换 ([over.best.ics])。 [...] 如果参数直接绑定到应用 转换函数到参数表达式,隐式 转换序列是用户定义的转换序列,与 第二个标准转换序列或者一个身份转换,或者, 如果转换函数返回一个类型为 参数类型的派生类,派生到基类的转换。

(强调我的)

在您的情况下,参数类型与参数类型相同,因此参数类型既不是从参数类型派生的,也不需要用户定义的转换函数。

【讨论】:

  • 我对此感到困惑,为什么转换不是限定转换,例如int a =0; const int& ptr = &a,我们知道这是限定转换,但为什么 const T& rf = t;不是
  • @jackX 资格转换实际上与此无关。这是关于指针 (int* -> const int*) 和 noexcept 函数 (void (*)() noexcept -> void (*)())
猜你喜欢
  • 1970-01-01
  • 2011-01-18
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 2013-10-20
  • 1970-01-01
相关资源
最近更新 更多