我已经阅读了很多关于 move 构造函数的文章(甚至在堆栈上)但是我没有在任何地方找到关于它如何工作的确切解释(如果这个临时变量及其地址将是遇到“)”时销毁)。
这是一个简单的例子
#include <iostream>
#include <vector>
using namespace std;
class boVector {
private:
int size;
public:
boVector() {};
boVector(const boVector& rhs) { cout << "copy Ctor." << endl; }
boVector(boVector&& rhs) { cout << "move Ctor." << endl; }
};
void foo(boVector v) {}
boVector createBoVector() { return boVector(); }
int main()
{
//copy
boVector reausable = createBoVector();
foo(reausable);
//move
foo(std::move(createBoVector()));
return 0;
}
都说move Ctor是shallow copy拷贝或者只是指针赋值。但是我如何使用指向临时对象的指针来启动我的对象(当这个对象被销毁时,我的对象将指向一个未知的地址,从我的角度来看这是无效的)。
初始化一个指针地址的变量是不对的,他遇到“)”后就不再存在了。
如果有人能解释一下这个临时变量在内存中的样子,以及如何将临时对象的地址分配给我当前的对象,并且这个操作是有效的。
最佳答案
“move 构造函数”并不神奇 - 它是一个采用右值引用的构造函数。
Rvalue references 绑定(bind)到临时对象,并具有即将过期且以后不会在程序中访问的内容的“含义”:这使开发人员能够实现资源 move - 在指针交换或类似的快速操作方面持有类。
您的 boVector
类不能真正利用 move 语义的任何优势,因为它只存储一个 int
并且不持有任何资源。 move 一个 int
和复制一个一样快。
在
foo(std::move(createBoVector()));
表达式,std::move
是多余的,因为 createBoVector()
已经是一个右值。
考虑:
foo(createBoVector());
这将调用 boVector(boVector&&)
,因为它比 boVector(const boVector&)
更好。
createBoVector()
创建的实例将在表达式的整个持续时间内存在 - 这意味着右值引用 将在整个持续时间内指向一个有效对象的 boVector(boVector&&)
。
关于c++ - move 构造函数如何在 C++ 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48302541/