可以说我有以下代码:

#include <iostream>
using namespace std;

class A{
public:
    A() { cout << "In normal ctor\n"; }
    A(const A& a) { cout << "In cpy ctor\n";  }
    A(A&& a) { cout << "In move ctor\n"; }
    ~A() { cout << "In dtor\n"; }
};

A func(A a) {
    return a;
}

void main(){
    A a1;
    A a2 = func(a1);
}

输出如下:
In normal ctor
In cpy ctor
In move ctor
In dtor
In dtor
In dtor

现在,我很难理解函数“func”中发生的事情。

将a1发送给函数时,该函数不会通过ref接收该函数,而是“创建”它的a1自身版本,即“a”。

这就是为什么当函数结束时,对象“死亡”并进入析构函数。

那么,为什么不首先将它也传递给构造函数? (假设确实在其中创建了本地对象)

幕后是否有任何复制?

提前致谢!

最佳答案

这是发生的情况(您程序的打印输出和解释):

  • 在正常情况下为-这发生在A a1;main
  • 在cpy ctor 中-当从A afunc初始化a1main时,会发生这种情况
  • 在移动中-当afunca1的副本的a2设置为a1时发生(当返回时,请参见copy elision)
  • 中-a2的副本被破坏
  • 中-a1被破坏
  • 中-a2被破坏

  • 我认为关键是要了解move构造函数在创建func中的作用。您的A按值返回a2,应将其复制到ojit_code中。但是,C++编译器意识到您的程序无法在分配后使用原始值,因此它通过调用move构造函数来优化调用。

    07-24 09:44
    查看更多