我试图了解标准中的哪些规则证明了下面的编译器行为。所以这个问题只是为了获得语言 - 律师答案。
让我们考虑这两个类:
struct A{
A(int);
};
struct B{
operator int();
};
以下代码编译:
B b;
A a{b};
变量a
由b
直接初始化。根据{{3}}:
否则(即,对于剩余的复制初始化情况),可以如上所述枚举可以从源类型转换为目标类型或(当使用转换函数时)到其派生类的用户定义的转换序列。在[over.match.copy],
我理解直接初始化的过程会列出所有用户定义的转换序列,它可以执行从B
(源类型)到A
的转换,目的地类型。 [over.match.copy]解释在哪里可以找到用户定义的转换函数。
用户定义的转换序列只能涉及1个用户定义的转换函数或构造函数。但唯一的转换路径包括调用转换构造函数A::A(int)
和转换函数B::operator int()
。
因此,没有用户定义的转换序列允许从B
转换为A
。
为什么根据标准,初始化A a{b};
可以很好地形成?
答案 0 :(得分:2)
它格式正确,因为它使用一次转换从B转换为int
。然后使用int
作为参数显式调用A的构造函数。
这种情况下,您有两个用户定义的转换:
void f( A a ) {}
B b;
f( b );