移动作业

类似于我们如何使用左值引用为对象赋值,复制它,我们也可以将值从一个对象移动到另一个对象而不构造一个新对象。我们称之为移动分配。我们将值从一个对象移动到另一个现有对象。

为此,我们将不得不重载 operator =,而不是像它在副本赋值中那样采用左值引用,但是它需要一个右值引用。

class A {
    int a;
    A& operator= (A&& other) {
        this->a = other.a;
        other.a = 0;
        return *this;
    }
};

这是定义移动分配的典型语法。我们重载 operator =,以便我们可以为它提供一个右值引用,它可以将它分配给另一个对象。

A a;
a.a = 1;
A b;
b = std::move(a); //calling A& operator= (A&& other)
std::cout << a.a << std::endl; //0
std::cout << b.a << std::endl; //1

因此,我们可以将对象分配给另一个对象。