【问题标题】:Copy Elision Misunderstanding复制省略误区
【发布时间】:2015-03-06 20:48:52
【问题描述】:
#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() 参数,但它对我来说是模糊的。

你能详细解释一下吗?

【问题讨论】:

  • 我想知道如果func2采用const引用,结果会有什么不同。

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


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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      相关资源
      最近更新 更多