2013-03-23 53 views
26

這應該是一個微不足道的問題,但我不能明確地找到它的計算器。何種條件下,編譯器不會定義implicits(構造函數,析構函數,拷貝構造函數,拷貝賦值)

下面將如果不是由用戶提供的隱式地定義。

  1. 默認(無參數)構造
  2. 拷貝構造函數
  3. 拷貝賦值運算符
  4. 析構函數

不過我讀的地方(我不能似乎現在找到),有編譯器不會隱式實現它們的一些條件。

這些是什麼條件呢?

回答

44

The Default Constuctor(例如,X())將不會被隱式生成的,如果:

  • 你有明確宣佈任何構造都
  • 存在是不是默認-constructible數據成員(如一個參考,一個const對象或一個沒有或不可訪問的默認構造函數的類)
  • (C++ 11)您明確告訴編譯器不要使用X() = delete;

The Copy Constructor(例如,X(const X&))將不會被隱若產生:

  • 你有明確宣佈拷貝構造函數(用於X類的構造函數取XX&const X&
  • 有是不拷貝構造(例如,沒有或不能訪問拷貝構造一個類)
  • 基類不是一個數據成員拷貝構造
  • (C++ 11)你宣佈此舉構造或移動賦值操作符
  • (C++ 11)你已經明確告訴編譯器使用不產生一個X(const X&) = delete;

The Copy Assignment Operator(例如,X& operator=(const X&))將不會被隱若產生:

  • 你有明確宣佈一個拷貝賦值運算符(Xoperator=採取XX&const X&)類
  • 存在在類的數據成員不是可複製分配的(例如參考,const對象或沒有或不可訪問賦值運算符的類)
  • 基類不是可複製賦值的
  • (C++ 11)你有宣佈此舉構造或移動賦值操作符
  • (C++ 11)你已經明確告訴編譯器使用X& operator=(const X&) = delete;

The Destructor不生成一個(例如,

  • 你有明確宣佈析構函數
  • (C++ 11)你甲肝:~X())將不會被是否隱式生成Ë明確告訴編譯器使用不產生一個~X() = delete;

The Move Constructor(C++ 11)(例如,X(X&&))將不會被隱若產生:

  • 你有明確宣佈一招構造函數(對於類X,構造函數採用X&&
  • 您有聲明複製賦值運算符,複製構造函數,析構函數或移動賦值ope rator
  • 有在你的類的數據成員,不能移動構造的(是const,是一個參考,或已被刪除的,不可訪問,或不明確的移動構造函數)
  • 基類不能被移動構造的
  • 你已經明確告訴編譯器使用不產生一個X(X&&) = delete;

The Move Assignment Operator(C++ 11)(例如:,X& operator=(X&&))將不會被隱若產生:

  • 你有明確宣佈移動賦值運算符(X類,一個operator=採取X&&
  • 你有宣佈一個拷貝賦值運算符,複製構造函數,析構函數或移動構造函數
  • 在您的類中存在無法移動分配的數據成員(是const,是引用或具有刪除,不可訪問或含糊不清的移動賦值運算符)
  • 基類不能布展分配
  • 你已經明確告訴編譯器使用X& operator=(X&&) = delete;
+0

那麼,在所有這些第二點,它會被隱式定義,就像'delete'不產生一個d。 – 2013-03-23 19:06:55

+1

+1不要忘記C++ 11的新增功能,您可以明確聲明它們不應該被創建('A(const A&)= delete;'),爲了完整性您應該添加Move構造函數。 – pickypg 2013-03-23 19:10:22

+0

@pickypg:我不確定移動構造函數,如果你將我想要的信息添加到我的答案中,我會很高興 – 2013-03-23 19:11:29