假设我有这段代码:
#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”。
这就是为什么当函数结束时,对象“死亡”并进入析构函数的原因。
那么为什么它不首先也交给构造函数呢? (假设真的在那里创建了一个本地对象)
幕后是否发生了任何复制?
提前致谢!
最佳答案
这是发生了什么(你的程序的打印输出和解释):
- 在普通构造器中 - 这发生在
main
的 - 在 cpy ctor - 当
func
的A a
从的
a1
初始化时会发生这种情况主 - In move ctor - 这发生在
func
的a
,a1
的拷贝,被设置为a2
(参见 copy elision 作为返回) - 在 dtor -
a1
的拷贝被销毁 - 在 dtor -
a2
被销毁 - 在 dtor -
a1
被销毁
A a1;
中
我认为这里的关键是理解移动构造函数在创建 a2
中的作用。您的 func
按值返回 A
,应该将其复制到 a2
中。但是,C++ 编译器意识到您的程序无法在赋值后使用原始值,因此它通过调用移动构造函数来优化调用。
关于c++ - 如何在函数中创建局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48755110/