c++ - move 构造函数如何在 C++ 中工作?

标签 c++ c++11 constructor move-semantics move-constructor

我已经阅读了很多关于 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/

相关文章:

c++ - 类参数编译错误

c++ - qt4宏检测KDE或GNOME

c++ - std::vector 作为 std::set 和 std::unordered_set 中的键

找不到 C++ 构造函数

c++ - 子类的构造函数后跟冒号后的基类构造函数是什么意思?

c++ - 用于重载的通用类成员函数

c++ - 如何检查分配给调用运算符结果的类型?

c++ - protected 成员变量的错误共享?

c++ - 编译器如何在下面的代码中通过ADL找到模板函数X::max(T const&, T const&)?

使用原型(prototype)的Javascript继承,什么是实用的方法?