2015-10-13 28 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

相關問題