0

可能重复:
为什么在这种情况下不调用复制构造函数?
什么是复制省略和返回值优化?

谁能向我解释为什么以下程序会产生输出“cpy:0”(至少在使用 g++ 4.5.2 编译时):

#include<iostream>

struct A {

    bool cpy;

    A() : cpy (false) {
    }

    A (const A & a) : cpy (true) {
    }

    A (A && a) : cpy (true) {
    };

};

A returnA () { return A (); }

int main() {

    A a ( returnA () );
    std::cerr << "cpy: " << a.cpy << "\n";
}

当我试图弄清楚这个例子看似奇怪的结果时,问题就出现了:用常量数据成员或引用成员移动类的ctor

4

1 回答 1

7

对于它自己创建的对象,编译器可以自由地省略复制和移动构造,即使它们有副作用。临时对象和返回值通常直接在正确的位置构造,省略复制或移动它们。但是,对于返回值,您需要小心一点,以使省略号生效。

如果要防止复制省略,则基本上需要有条件地返回两个候选对象:

bool flag(false);
A f() {
    A a;
    return flag? A(): a;
}

假设您不更改flag这将始终创建一个副本a(除非编译器自我上次尝试后变得更聪明)。

于 2012-11-26T14:41:42.373 回答