11 October 2022

C++ 核心指南目录

C.46: By default, declare single-argument constructors explicit

理由

避免的诡异的类型转换。

例子

class String {
public:
    String(int);   // BAD
    // ...
};

String s = 10;   // surprise: string of size 10

int 型转成 String 是一种很奇怪的隐式类型转换。

例外

如果确实需要隐式地将构造函数参数类型转换成类类型,避免显式转换。

class Complex {
public:
    Complex(double d);   // OK: we want a conversion from d to {d, 0}
    // ...
};

Complex z = 10.7;   // unsurprising conversion

double 转成复数就比较合理。

注意

复制和移动构造函数不能是显式的那种强硬的类型转换。复制和移动构造函数进行显式强硬的类型转换会导致值的传入和返回变得很复杂。

强化

  • (简单)单参数构造函数要声明成显式的。大多数情况下,隐式的单参数构造函数不太写的好。所以如果单参数构造函数不在白名单中,就进行警告。