2015-10-13 43 views
9

之前C++ 11,我可以用它来使一个类不可复制:使类不可复制*和*不可移动

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

用C++ 11,我能做到这一点像这样:

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

当使用具有删除副本和赋值的类时,是否有机会生成默认移动运算符?而且班级并不完全被复制,而是被移动(这有点类似)?

所以,我必须这样做是为了防止默认移动建设和assignmnent:

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

...?

+0

你不需要它。就我个人而言,我把这样的东西放到一个名为'NoCopyOrMove'的私有基类中,所以它不会混乱我的代码。 – MikeMB

+0

'MyClass(MyClass &&)= delete;'会隐式禁止其他人 – sp2danny

回答

14

正如其他人在评论中已经提到的那样,删除的构造函数是在C++ 11中引入的。要回答你的问题,以下规则持有一般:

  1. 两个拷贝操作是独立的。声明拷贝构造函数不会阻止编译器生成拷贝分配,反之亦然。 (与C++ 98相同)
  2. 移动操作不是独立的。声明要么阻止编译器生成另一个。 (与复制操作不同)
  3. 如果声明了任何复制操作,则不会生成任何移动操作。(您的情况)
  4. 如果声明了任何移动操作,则不会生成任何复制操作。这是以前的相反规则。
  5. 如果声明了析构函数,则不会生成任何移动操作。复制操作仍然生成与C++ 98的反向兼容性。
  6. 默认构造函数仅在未声明构造函数时生成。 (同C++ 98)

正如意见中的要求,这里有一些源(C++ 11草案N3242):

  • 复制操作:§12.8.8,§ 19年8月12日
  • 移动操作:§10年8月12日,第21年8月12日
  • 默认构造方法:第12.1.5
+1

从哪里得到这些事实? – Yola

+3

这是我的知识:)对于您的请求,我扩展了我的答案,并添加了一些引用C++标准来支持它。 – mcserep

10

当您声明复制构造函数时,不会生成移动构造函数/赋值。 so

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

不是必需的。

您仍然可以将其添加为更加明确。

+0

显式是好的:我总是声明所有的操作符,并选择性地删除我不需要的操作符。它使我的意图清楚,并且为了防止出现编译器错误,它应该仍然按我期望的方式工作。 – 2015-11-02 03:30:06

相关问题