C++ 使用 cppcheck 建议的显式
C++ use of explicit suggested by cppcheck
使用强制转换构造函数不好吗?
否则为什么代码质量检查器(在我的例子中是 cppcheck)会不断建议在单参数构造函数之前添加显式?
如果我想怎么办
class MyClass {
A(int) {}
};
A a = 1;
如果我按照“建议”写
class MyClass {
explicit A(int) {}
};
A a = 1;
会引发错误,但如果我使用第一个,我会收到一条警告,提示我必须记录才能通过代码审查。
C.46: By default, declare single-argument constructors explicit
Reason
To avoid unintended conversions.
Example, bad
class String {
public:
String(int); // BAD
// ...
};
String s = 10; // surprise: string of size 10
Exception
If you really want an implicit conversion from the constructor
argument type to the class type, don't use explicit:
class Complex {
public:
Complex(double d); // OK: we want a conversion from d to {d, 0}
// ...
};
Complex z = 10.7; // unsurprising conversion
See also: Discussion of implicit conversions
这种隐式的class类型转换很容易被无意间使用。使用此转换构造函数,每个接受 MyClass
作为参数的函数或成员函数也将接受 int
。因此,传递给此类函数的每个 int
都将转换为临时 MyClass
,在函数完成后将被丢弃。可能不是你想要的。
使用强制转换构造函数不好吗? 否则为什么代码质量检查器(在我的例子中是 cppcheck)会不断建议在单参数构造函数之前添加显式?
如果我想怎么办
class MyClass {
A(int) {}
};
A a = 1;
如果我按照“建议”写
class MyClass {
explicit A(int) {}
};
A a = 1;
会引发错误,但如果我使用第一个,我会收到一条警告,提示我必须记录才能通过代码审查。
C.46: By default, declare single-argument constructors explicit
Reason
To avoid unintended conversions.
Example, bad
class String { public: String(int); // BAD // ... }; String s = 10; // surprise: string of size 10
Exception
If you really want an implicit conversion from the constructor argument type to the class type, don't use explicit:
class Complex { public: Complex(double d); // OK: we want a conversion from d to {d, 0} // ... }; Complex z = 10.7; // unsurprising conversion
See also: Discussion of implicit conversions
这种隐式的class类型转换很容易被无意间使用。使用此转换构造函数,每个接受 MyClass
作为参数的函数或成员函数也将接受 int
。因此,传递给此类函数的每个 int
都将转换为临时 MyClass
,在函数完成后将被丢弃。可能不是你想要的。