使 class 不可复制 *和* 不可移动
Make a class non-copyable *and* non-movable
在 C++11 之前,我可以用它来使 class 不可复制:
private:
MyClass(const MyClass&);
MyClass& operator=(const MyClass&);
使用 C++11,我可以这样做:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
将class与删除的副本和赋值一起使用时,是否有可能生成默认移动运算符?而且 class 并没有完全复制,而是移动了(有点相似)?
那么,我是否必须这样做以防止默认移动构造和赋值:
MyClass(MyClass&&) = delete;
MyClass& operator=(MyClass&&) = delete;
... ?
声明复制构造函数时不会生成移动constructor/assignment。
所以
MyClass(MyClass&&) = delete;
MyClass& operator=(MyClass&&) = delete;
不需要。
您仍然可以添加它以使其更明确。
正如其他人已经在评论中提到的,删除的构造函数是在 C++11 中引入的。要回答您的问题,通常遵循以下规则:
- 两次复制操作是独立的。声明复制构造函数不会阻止编译器生成复制赋值,反之亦然。 (与 C++98 相同)
- 移动操作不是独立的。声明其中之一会阻止编译器生成另一个。 (不同于复制操作。)
- 如果声明了任何复制操作,那么将生成none个移动操作。 (你的情况。)
- 如果声明了任何一个移动操作,那么将生成none个复制操作。这与前面的规则相反。
- 如果声明了析构函数,那么会产生none的移动操作。为了与 C++98 反向兼容,仍然会生成复制操作。
- 仅在未声明构造函数时生成默认构造函数。 (与 C++98 相同)
根据评论中的要求,这里有一些来源(C++11 是草案 N3242):
- 复制操作:§ 12.8.8、§ 12.8.19
- 移动操作:§ 12.8.10、§ 12.8.21
- 默认构造函数:§ 12.1.5
在 C++11 之前,我可以用它来使 class 不可复制:
private:
MyClass(const MyClass&);
MyClass& operator=(const MyClass&);
使用 C++11,我可以这样做:
MyClass(const MyClass&) = delete;
MyClass& operator=(const MyClass&) = delete;
将class与删除的副本和赋值一起使用时,是否有可能生成默认移动运算符?而且 class 并没有完全复制,而是移动了(有点相似)?
那么,我是否必须这样做以防止默认移动构造和赋值:
MyClass(MyClass&&) = delete;
MyClass& operator=(MyClass&&) = delete;
... ?
声明复制构造函数时不会生成移动constructor/assignment。
所以
MyClass(MyClass&&) = delete;
MyClass& operator=(MyClass&&) = delete;
不需要。
您仍然可以添加它以使其更明确。
正如其他人已经在评论中提到的,删除的构造函数是在 C++11 中引入的。要回答您的问题,通常遵循以下规则:
- 两次复制操作是独立的。声明复制构造函数不会阻止编译器生成复制赋值,反之亦然。 (与 C++98 相同)
- 移动操作不是独立的。声明其中之一会阻止编译器生成另一个。 (不同于复制操作。)
- 如果声明了任何复制操作,那么将生成none个移动操作。 (你的情况。)
- 如果声明了任何一个移动操作,那么将生成none个复制操作。这与前面的规则相反。
- 如果声明了析构函数,那么会产生none的移动操作。为了与 C++98 反向兼容,仍然会生成复制操作。
- 仅在未声明构造函数时生成默认构造函数。 (与 C++98 相同)
根据评论中的要求,这里有一些来源(C++11 是草案 N3242):
- 复制操作:§ 12.8.8、§ 12.8.19
- 移动操作:§ 12.8.10、§ 12.8.21
- 默认构造函数:§ 12.1.5