CppCoreGuidelines C.46 默认的,声明单参数构造函数为显式的
11 October 2022
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
转成复数就比较合理。
注意
复制和移动构造函数不能是显式的那种强硬的类型转换。复制和移动构造函数进行显式强硬的类型转换会导致值的传入和返回变得很复杂。
强化
- (简单)单参数构造函数要声明成显式的。大多数情况下,隐式的单参数构造函数不太写的好。所以如果单参数构造函数不在白名单中,就进行警告。