分隔 copy/move 赋值运算符

Separating copy/move assignment operator

我在这里读过:What are move semantics?,副标题:特殊成员函数,我们应该统一复制赋值运算符和移动赋值运算符的原因单个 move\copy 赋值运算符,

但是如果我们希望禁止复制或移动呢?在这种情况下,我应该在禁止的构造函数上指示 "deleted" 并实现另一个吗? (即两者之间的分离)。

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

如果你想创建一个可移动但不可复制的class,你应该实现移动构造函数并将复制构造函数标记为已删除。

复制和交换模式仍然有效(更多的是移动和交换,真的)。由于参数只能移动构造,因此只能移动赋值。

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))。如果声明移动构造函数,默认复制赋值运算符将被隐式删除。