先注意这一段代码:
#include <iostream>
class A {
public:
int n = 0;
A(int n) : n(n) {}
};
void printA(const A& a) {
std::cout<<a.n<<std::endl;
}
int main() {
printA(1);
A a = 1;
}
直觉上这段代码会出错,因为printA接受的是A类的参数,1是个啥;同样的,A a = 1又是什么鬼?然而实际上这段代码是可以编译通过的。原因是在调用A的构造函数时,构造函数将用作从参数类型到类类型的隐式转换函数。
这种隐式转换虽然不会报错,但往往是无意义的,也会在程序运行期间显现出来,增大修改代码bug的难度,所以我们有时需要禁用这种隐式转换,毕竟编译阶段出错要由于运行阶段出错。
这时关键字explicit就可以用上了,声明构造函数为explicit,可以指定其为显式,就能从根本上杜绝这种问题了。
从C++11起,explicit也可指定构造函数或转换函数为显式, 即它不能用于隐式转换和复制初始化。