不应过度使用 explicit 关键字
5.1.13 ID_excessiveExplicit
对类的拷贝、移动以及不接受 1 个参数的构造函数一般不用 explicit 限定,否则有损代码的易用性和可扩展性。
示例:
class A {
public:
explicit A(const A&); // In general, ‘explicit’ is not required
explicit A(A&&); // Ditto
explicit A(int, int); // Ditto
....
};
当类的拷贝、移动构造函数被 explicit 限定时,无法再按值传递参数或按值返回对象,当不接受 1 个参数的构造函数被 explicit 限定时,无法再用初始化列表定义临时对象,如下代码将无法通过编译:
void foo(A);
void bar(const A&);
A a(1, 2);
foo(a); // Compile error
bar({3, 4}); // Compile error