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

标签 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
}

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

最佳答案

没有多步用户自定义隐式转换。

int -> bool -> A

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

12.3 转换 [class.conv]

1 Type conversions of class objects can be specified by constructors and by conversion functions. These conversions are called user-defined conversions and are used for implicit type conversions (clause 4), for initialization (8.5), and for explicit type conversions (5.4, 5.2.9).

2 User-defined conversions are applied only where they are unambiguous (10.2, 12.3.2). Conversions obey the access control rules (clause 11). Access control is applied after ambiguity resolution (3.4).

3 [ Note: See 13.3 for a discussion of the use of conversions in function calls as well as examples below. —end note ]

4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.

关于c++ - 不允许对自定义类型进行多次隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12847272/

相关文章:

c++ - strtod 不会在错误输入时设置 errno

c - 与负数比较时,为什么 sizeof 运算符会发生这种情况?

c - C如何处理混合精度运算

c++ - 如何获取 void* 指针的类型标识?

c++ - 函数与来自未命名命名空间的参数的链接

c++ - 如何在不取消引用的情况下调用指向函数的指针?

iOS:将 id 转换为 int

c++ - 为什么 g++ 在给定情况下明确定义明确时会说格式错误的缩小?

c# - 将 System.Drawing.Image 转换为 System.Windows.Media.ImageSource 没有结果

C++ : Understanding implicit typecasting for classes with a constructor with 1 argument