既不复制也不移动构造函数

时间:2012-11-26 14:36:58

标签: c++ copy-constructor move-constructor

  

可能重复:
  Why copy constructor is not called in this case?
  What are copy elision and return value optimization?

有人可以向我解释为什么以下程序产生输出“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";
}

当我试图弄清楚这个例子看似奇怪的结果时出现了问题:move ctor of class with a constant data member or a reference member

1 个答案:

答案 0 :(得分:6)

编译器可以自由地复制和移动构造,即使它们具有副作用,也可以代表它自己创建的对象。临时对象和返回值通常直接构造在正确的位置,不会复制或移动它们。但是,对于返回值,您需要小心谨慎才能获得省略。

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

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

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