“A a(1)”可以编译通过,“A b=1”这句报错,错误信息是“conversion from ‘int’ to non-scalar type ‘A’ requested”。这意味着编译器找不到int类型转换成A类型的转换函数了。如果不加explicit,参数为int的构造函数可以用于自动把int转换为A类型,但是现在不可以了。第一句的“A a(1)”有参数为int的构造函数的显式调用,而第二句“A b=1”没有显式调用。
下面我们只把拷贝构造函数改成explicit
还是第二句编译错误。错误信息是“no matching function for call to ‘A::A(A)’”,这说明编译器找不到拷贝构造函数了。和前面第一种情况中说明的一样,编译器在把临时对象复制到b中时,需要调用A类的拷贝构造函数。现在拷贝构造函数是explicit的,只能显式的调用,不能隐含调用。第二句没有“A b(temp)”这样显式复制对象,所以编译出错。