使用强制转换构造函数不好吗?否则为什么代码质量检查器(在我的例子中是 cppcheck)会不断建议在单参数构造函数之前添加显式?
如果我想做什么
class MyClass {
A(int) {}
};
A a = 1;
如果我按照“建议”写
class MyClass {
explicit A(int) {}
};
A a = 1;
会抛出一个错误,但如果我使用第一个错误,我会收到一个警告,我必须记录以通过代码审查。
使用强制转换构造函数不好吗?否则为什么代码质量检查器(在我的例子中是 cppcheck)会不断建议在单参数构造函数之前添加显式?
如果我想做什么
class MyClass {
A(int) {}
};
A a = 1;
如果我按照“建议”写
class MyClass {
explicit A(int) {}
};
A a = 1;
会抛出一个错误,但如果我使用第一个错误,我会收到一个警告,我必须记录以通过代码审查。
C.46 : 默认情况下,显式声明单参数构造函数
原因
避免意外转换。
例子,不好
class String { public: String(int); // BAD // ... }; String s = 10; // surprise: string of size 10
例外
如果您真的想要从构造函数参数类型到类类型的隐式转换,请不要使用显式:
class Complex { public: Complex(double d); // OK: we want a conversion from d to {d, 0} // ... }; Complex z = 10.7; // unsurprising conversion
另见:隐式转换的讨论
这种隐式类类型转换可以很容易地使用而无需有意。使用这个转换构造函数,每个接受MyClass
作为参数的函数或成员函数也将接受int
。因此,每个int
传递给这样一个函数的都将被转换为一个临时MyClass
的,在函数完成后将被丢弃。可能不是你想要的。