复制省略误区

Copy Elision Misunderstanding

#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

Copy Constr

Copy Constr

我的问题是:为什么 2 Copy Constr?我以为只需要一份。

我可能会猜测 func1() 会抛出一个临时对象,这个临时对象需要复制到另一个内存区域,然后必须再次从该区域为 func2() 参数制作一个副本,但对于我.

能详细解释一下吗?

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

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

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