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