移动构造函数如何在C++中工作?

5 c++ constructor move-constructor move-semantics c++11

我已经阅读了很多关于移动构造函数的文章(甚至在堆栈上),但是我没有找到关于它是如何工作的确切解释(如果转移指针指向临时对象并且如果此临时变量及其地址在遇到时将被销毁则保存")").

这是一个简单的例子

#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;
}
Run Code Online (Sandbox Code Playgroud)

所有人都说移动Ctor是浅拷贝副本或只是一个指针赋值.但是,如何使用指向临时对象的指针启动我的对象(当此对象将被破坏时,我的对象将指向一个未知地址,从我的角度来看这是无效的).

用指针地址启动变量是不对的,在满足")"后它将不再存在.

请问是否可以有人解释我如何在内存中查找此临时变量以及如何将临时对象的地址分配给我当前的一个并且此操作是有效的.

Vit*_*meo 10

"移动构造函数"并不神奇 - 它是一个采用右值引用的构造函数.

Rvalue引用绑定到临时对象,并具有即将到期的某些东西的"含义",并且稍后将无法在程序中访问:这使开发人员能够根据指针交换或类似方式实现资源保持类的移动快速操作.

你的boVector类无法从移动语义中获得任何优势,因为它只存储一个int并且不包含任何资源.移动a int和复制一个一样快.


在里面

foo(std::move(createBoVector()));
Run Code Online (Sandbox Code Playgroud)

表达式,std::move因为createBoVector()已经是一个rvalue是多余的.


考虑:

foo(createBoVector());
Run Code Online (Sandbox Code Playgroud)

这将调用,boVector(boVector&&)因为它是一个更好的匹配boVector(const boVector&).

创建的实例createBoVector()将在表达式的整个持续时间内生效- 这意味着rvalue引用将持续指向有效对象boVector(boVector&&).