为什么不调用copy-constructor但在此代码中调用默认构造函数?

时间:2014-02-11 11:05:34

标签: c++ copy-constructor

我理解当从现有对象创建对象时以及函数按值返回对象时,将调用复制构造函数。那么为什么在下面的代码中没有调用复制构造函数,而是默认的构造函数?

class A {
public:
    A() { cout << "A" << endl; }
    A(A &) { cout << "A&" << endl; }
    A(const A &) { cout << "const A&" << endl; }
};
A fun() {
    class A a;
    return a;
}
int main() {
    class A a = fun(); // output: A
}

1 个答案:

答案 0 :(得分:3)

简答:编译器优化。

  • 首先,函数中的a对象直接在main函数的范围内创建,以避免必须复制(或在C ++ 11中移动)本地参数通过函数返回超出函数范围。这是返回值优化

  • 然后,在main中,语句变得等同于class A a = A(),并且允许编译器在适当的位置创建a对象,而无需从临时对象进行复制。这是 copy elision

即使复制构造函数(完全被绕过)具有副作用,也允许这样做,如您的示例所示。

相关问题