7
#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

输出是:

定义常数

复制构造

复制构造

我的问题是:为什么 2 Copy Consr ?我认为只需要 1 份副本。

我可能猜测 func1() 抛出了一个临时对象,并且这个临时对象需要被复制到另一个内存区域,并且必须再次从该区域复制 func2() 参数,但它对我来说是模糊的。

你能详细解释一下吗?

4

2 回答 2

6
  1. The return value of func1 is copied from the expression A{}.
  2. The value of the function call expression func1() is copied into the function parameter of func2.
于 2015-03-06T12:33:12.377 回答
2

是的,你的理解是对的。您的代码行(没有复制省略)类似于

int main()
{
  {
    A temp = func1();  // 2nd copy
    func2(temp);  // 3rd copy
  }
}
于 2015-03-06T12:37:37.210 回答