c++ - 使类不可复制*和*不可 move

标签 c++ c++11 constructor move move-semantics

在 C++11 之前,我可以使用它来使类不可复制:

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

使用 C++11,我可以这样做:

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

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

那么,我是否必须这样做以防止默认 move 构造和分配:

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

... ?

最佳答案

正如其他人在评论中已经提到的,删除的构造函数是在 C++11 中引入的。为了回答您的问题,一般遵循以下规则:

  1. 这两个复制操作是独立的。声明复制构造函数不会阻止编译器生成复制赋值,反之亦然。 (与 C++98 相同)
  2. move 操作不是独立的。声明其中一个会阻止编译器生成另一个。 (不同于复制操作。)
  3. 如果声明了任何复制操作,则不会生成任何 move 操作。 (您的情况。)
  4. 如果声明了任何 move 操作,则不会生成任何复制操作。这是与之前相反的规则。
  5. 如果声明了析构函数,则不会生成任何 move 操作。仍会生成复制操作以与 C++98 反向兼容。
  6. 仅在没有声明构造函数时才生成默认构造函数。 (与 C++98 相同)

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

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

关于c++ - 使类不可复制*和*不可 move ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33096653/

相关文章:

c++ - 为什么 auto 关键字不能与指向函数的指针的初始化列表一起使用?

c++11 使用 std::swap 与 operator=(T&&) 清除容器

c++ - 如何将 "this"指针传递给全局函数

c++ - typedef 和 using 在语义上是等价的是什么意思?

c++ - Qt QFile 和 OpenGL ES 2.0 顶点着色器意外的文件结尾

c++ - 如何纠正不一致的 Unresolved external 错误?

android - 与 Android 设备交互的桌面应用程序

c++ - 如何在没有类型代码的情况下普遍引用类的实例?

c++ - 创建带参数的类实例

c++ - 结构定义导致我收到多重定义符号错误