不允许对自定义类型进行多次隐式转换?

Jof*_*sey 12 c++ type-conversion implicit-conversion

class C {
public:
    C() { }
};

class B {
public:
    B(C c) { }
    B() { }
};

class A {
public:
    A(bool b) { }
    A(B b) { }
};

int main() {
    A a1 = true; // bool -> A        is allowed
    A a2 = B();  // B -> A           is allowed

    A a3 = 7;    // int -> bool -> A is allowed
    A a4 = C();  // C -> B -> A      isn't allowed
}
Run Code Online (Sandbox Code Playgroud)

为什么我可以使用两步隐式转换bool但不能使用它C?描述多步隐式转换的一般规则是什么?

Luc*_*ore 12

没有多步骤用户定义的隐式转换.

int -> bool -> A
Run Code Online (Sandbox Code Playgroud)

是允许的,因为int->bool转换不是用户定义的.

12.3转换[class.conv]

1类对象的类型转换可以由构造函数和转换函数指定.这些转换称为用户定义的转换,用于隐式类型转换(第4节),初始化(8.5)和显式类型转换(5.4,5.2.9).

2用户定义的转换仅在明确无误的情况下应用(10.2,12.3.2).转换遵守访问控制规则(第11条).模糊度解决(3.4)后应用访问控制.

3 [注意:有关在函数调用中使用转换的讨论以及下面的示例,请参见13.3. - 尾注]

4最多只有一个用户定义的转换(构造函数或转换函数)隐式应用于单个值.