让一个类不可复制和不可移动

Make a class non-copyable *and* non-movable

本文关键字:可复制 可移动 一个      更新时间:2023-10-16

在c++ 11之前,我可以使用这个来使一个类不可复制:

private:
MyClass(const MyClass&);
MyClass& operator=(const MyClass&);

在c++ 11中,我可以这样做:

MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;

当使用带有删除的复制和赋值的类时,是否有可能生成默认的move操作符?而且这个类并没有完全复制,而是移动了(这有点类似)?

那么,我必须这样做来防止默认的移动构造和分配吗?
MyClass(MyClass&&) = delete;
MyClass& operator=(MyClass&&) = delete;

…div ?

正如其他人在评论中提到的那样,在c++ 11中引入了已删除的构造函数。为了回答你的问题,以下规则一般成立:

  1. 两个拷贝操作是独立的。声明复制构造函数并不能阻止编译器生成拷贝赋值,反之亦然。(与c++ 98相同)
  2. 移动操作不是独立的。声明其中任何一个都可以防止编译器生成另一个。(与复制操作不同)
  3. 如果声明了任何复制操作,则不会生成任何移动操作。
  4. 如果声明了任何移动操作,则不会生成任何复制操作。
  5. 如果声明了析构函数,则不会生成任何move操作。为了与c++ 98反向兼容,仍然会生成复制操作。
  6. 仅在未声明构造函数时生成的默认构造函数。(与c++ 98相同)

根据评论的要求,这里有一些来源(c++ 11是N3242草案):

  • 复制操作:§12.8.8,§12.8.19
  • 移动操作:§12.8.10,§12.8.21
  • 默认构造函数:§12.1.5

在声明复制构造函数时不会生成移动构造函数/赋值。

MyClass(MyClass&&) = delete;
MyClass& operator=(MyClass&&) = delete;

不需要。

您仍然可以添加它以更明确