复制Elision误解

时间:2015-03-06 12:31:29

标签: c++ c++11 copy-elision

#include <iostream>

struct A
{
    A() { std::cout << "Def Constr\n"; }

    A(const A&) { std::cout << "Copy Constr\n"; }
};

A func1() 
{
    return A{};
}

void func2(A a) {}

int main()
{
    func2(func1());
}

编译后
  

g ++ Copy.cpp -std = c ++ 11 -fno-elide-constructors

输出是:

  

Def Constr

     

复制Constr

     

复制Constr

我的问题是:为什么2复制Constr?我以为只需要1份。

我可能猜测func1()会抛出一个临时对象,并且需要将此临时对象复制到另一个内存区域,并且必须再次从该区域为func2()参数创建一个副本,但它对我来说很模糊。

你能详细解释一下吗?

2 个答案:

答案 0 :(得分:6)

  1. func1的返回值是从表达式A{}
  2. 复制而来的
  3. 函数调用表达式func1()的值被复制到func2的函数参数中。

答案 1 :(得分:2)

是的,你的理解是正确的。您的代码行(没有复制删除)类似于

int main()
{
  {
    A temp = func1();  // 2nd copy
    func2(temp);  // 3rd copy
  }
}