【问题标题】:Separating copy/move assignment operator分离复制/移动赋值运算符
【发布时间】:2017-04-19 12:01:39
【问题描述】:

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

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

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

【问题讨论】:

  • 只需将它们分开,就像该部分中的前两个代码块一样
  • 你指的是copy-and-swap赋值运算符的成语吗?
  • vu1p3nox,是的,我是。
  • 那么,您希望您的班级支持哪些操作?这取决于你。
  • 此外,显示的“统一”也有取舍。我个人认为这不是一个好主意。

标签: c++ c++11 move-semantics assignment-operator


【解决方案1】:

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

复制和交换模式仍然有效(实际上更像是移动和交换)。由于参数只能移动构造,所以只能移动赋值。

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

【讨论】:

  • 非常感谢!完全理解。
猜你喜欢
  • 2017-11-21
  • 2020-05-16
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 2019-03-31
  • 2018-09-21
相关资源
最近更新 更多