分开副本/移动分配操作员

Separating copy/move assignment operator

本文关键字:分配 操作员 移动 副本      更新时间:2023-10-16

我已经在这里阅读:在次级标题下移动语义是什么:特殊成员函数,我们应该统一复制分配运算符&amp&的原因将分配运算符移动到单个MOVE 复制分配操作员

但是,如果我们希望禁止复制或移动怎么办?在这种情况下,我应该在禁止的构造函数上指出"已删除"并实现另一个?(即在两者之间分开)。

如果是这样,什么是正确的方法?

如果要创建一个可移动但不可复制的类,则应实现MOVE构造函数并将复制构造函数标记为已删除。

复制和汇款模式仍然有效(实际上,更多的是移动和交换)。由于只能构造参数,因此只能进行移动分配。

class MyClass
{
    MyClass(MyClass&& other) {
        // Do your move here
    }
    MyClass(const MyClass& other) = delete;
    MyClass& operator=(MyClass other) {
        // You can still use copy-and-swap (move-and-swap, really)
        // Since MyClass is non-copyable, only move assignment will be available
    }
};

或者您可以改用移动分配运算符(MyClass& operator=(MyClass&& other))。如果您声明移动构造函数。