c++ - 复制省略误区

标签 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

Copy Constr

Copy Constr

我的问题是:为什么 2 Copy Constr?我认为只需要 1 个拷贝。

我可能会猜测 func1() 会抛出一个临时对象,而这个临时对象需要复制到另一个内存区域,并且必须再次从该区域为 func2() 参数制作一个拷贝,但这对我来说很模糊。

能详细解释一下吗?

最佳答案

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

关于c++ - 复制省略误区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28898860/

相关文章:

c++ - 如何使用 boost 异步执行两个线程?

c++ - GCC NRVO/RVO 警告

c++ - 如何在 C++ 中连接两个 LPCWSTR

C++赋值运算符默认返回

c++ - "Assignable"到底是什么意思?

c++ - std::unique_ptr 用于需要免费的 C 函数

c++ - g++ 链接静态库错误

c++ - 避免 const 和非常量成员函数中的代码重复

c++ - 复制省略导致不同的结果

c++ - 是否有可能确保复制省略?