为什么转换涉及两个用户定义的转换功能/构造函数



我试图理解标准中的哪个规则在下面证明了编译器行为的合理性。因此,此问题仅旨在获得语言律师答案。

让我们考虑一下这两个类:

struct A{
   A(int);
};
struct B{
   operator int();
};

以下代码编译:

 B b;
 A a{b};

变量ab直接初始化。根据[dlc.init]/17.6.3:

否则(即,对于剩余的副本限制案例(,用户定义的转换序列可以从源类型转换为目标类型,或者(当使用转换功能时(转换为派生类别,如所述在[over.match.copy]中,

我了解,直接初始化的过程将列出所有用户定义转换序列,该序列可以执行从B(源类型(转换为目标类型A。[Over.Match.Copy]说明在哪里可以找到用户定义的转换功能。

a 用户定义的转换序列只能涉及1个用户定义的转换功能或构造函数。但是,唯一的转换路径包括调用转换构造函数A::A(int)和转换函数B::operator int()

因此,没有用户定义的转换序列可以从B转换为A

为什么根据标准可以很好地形成初始化A a{b};

它的形式很好,因为它使用一种转换从B转换为int。然后使用该int作为参数。

这将是您有两个用户定义转换的情况:

  void f( A a ) {}
  B b;
  f( b  );      

最新更新