为什么编译器在第1行给出错误,即使第1行不会调用复制构造函数,如果将复制构造函数签名声明为const,错误也会消失?
class A {
int i;
public:
A(int n) :
i(n) {
cout << "A ctor" << endl;
}
A(A& a) :
i(a.i) {
cout << "A c-ctor" << endl;
}
~A() {
}
};
int main() {
A a1(1);
A a2 = 2; // line 1
A a3 = a1; // line 2
}
//上面的代码是用MinGW编译的
答案 0 :(得分:1)
这是隐式构造函数调用的效果。尝试在构造函数声明
之前添加“explicit”子句....
explicit A(int n) :
i(n) {
cout << "A ctor" << endl;
}
....
鉴于此,编译器会抱怨“从'int'转换为非标量类型'A'请求”。这说明了原因:
A a2 = 2; // line 1, original, fails on explicit construction
A a2 = A(2); // line 1, auto-substituted by compiler if implicit construction allowed
因此,如果我们的编译器可以找到一种通过构造函数调用自动将一种类型转换为另一种类型的方法,那么它会在这里自动实例化。
这也给出了“为什么'const'复制构造函数所需的答案”:
A a2 = A(2);
A a2(A(2)); // default implementation of '= operator'
这里,A(2)是临时对象。因此,编译器会尝试获取非const引用并失败(因为它是rvalue - 否则你可以尝试改变在行尾会死的东西)。