复制Elision误解

Ole*_*leg 7 c++ copy-elision c++11

#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());
}
Run Code Online (Sandbox Code Playgroud)

编译完成后

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

输出是:

Def Constr

复制Constr

复制Constr

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

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

你能详细解释一下吗?

Ker*_* SB 6

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


Moh*_*ain 2

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

int main()
{
  {
    A temp = func1();  // 2nd copy
    func2(temp);  // 3rd copy
  }
}
Run Code Online (Sandbox Code Playgroud)