1

为什么编译器会在第 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编译的

4

1 回答 1

1

这是隐式构造函数调用的效果。尝试在构造函数声明之前添加“显式”子句

....
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) 是临时对象。因此,编译器会尝试获取对它的非常量引用并失败(因为它是右值 - 否则您可以尝试更改将在行尾终止的内容)。

于 2013-06-22T10:05:19.953 回答