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

时间:2018-02-21 22:00:26

标签: c++ type-conversion language-lawyer

我试图了解标准中的哪些规则证明了下面的编译器行为。所以这个问题只是为了获得语言 - 律师答案。

让我们考虑这两个类:

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

以下代码编译:

 B b;
 A a{b};

变量ab直接初始化。根据{{​​3}}:

  

否则(即,对于剩余的复制初始化情况),可以如上所述枚举可以从源类型转换为目标类型或(当使用转换函数时)到其派生类的用户定义的转换序列。在[over.match.copy],

我理解直接初始化的过程会列出所有用户定义的转换序列,它可以执行从B(源类型)到A的转换,目的地类型。 [over.match.copy]解释在哪里可以找到用户定义的转换函数。

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

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

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

1 个答案:

答案 0 :(得分:2)

它格式正确,因为它使用一次转换从B转换为int。然后使用int作为参数显式调用A的构造函数。

这种情况下,您有两个用户定义的转换:

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