可以说我有以下代码:
#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
中A a
的func
初始化a1
的main
时,会发生这种情况a
的func
,a1
的副本的a2
设置为a1
时发生(当返回时,请参见copy elision)a2
的副本被破坏a1
被破坏a2
被破坏我认为关键是要了解move构造函数在创建
func
中的作用。您的A
按值返回a2
,应将其复制到ojit_code中。但是,C++编译器意识到您的程序无法在分配后使用原始值,因此它通过调用move构造函数来优化调用。