26
這應該是一個微不足道的問題,但我不能明確地找到它的計算器。何種條件下,編譯器不會定義implicits(構造函數,析構函數,拷貝構造函數,拷貝賦值)
下面將如果不是由用戶提供的隱式地定義。
- 默認(無參數)構造
- 拷貝構造函數
- 拷貝賦值運算符
- 析構函數
不過我讀的地方(我不能似乎現在找到),有編譯器不會隱式實現它們的一些條件。
這些是什麼條件呢?
這應該是一個微不足道的問題,但我不能明確地找到它的計算器。何種條件下,編譯器不會定義implicits(構造函數,析構函數,拷貝構造函數,拷貝賦值)
下面將如果不是由用戶提供的隱式地定義。
不過我讀的地方(我不能似乎現在找到),有編譯器不會隱式實現它們的一些條件。
這些是什麼條件呢?
The Default Constuctor(例如,X()
)將不會被隱式生成的,如果:
const
對象或一個沒有或不可訪問的默認構造函數的類)X() = delete;
The Copy Constructor(例如,X(const X&)
)將不會被隱若產生:
X
類的構造函數取X
,X&
或const X&
)X(const X&) = delete;
The Copy Assignment Operator(例如,X& operator=(const X&)
)將不會被隱若產生:
X
的operator=
採取X
,X&
或const X&
)類const
對象或沒有或不可訪問賦值運算符的類)X& operator=(const X&) = delete;
The Destructor不生成一個(例如,
~X()
)將不會被是否隱式生成Ë明確告訴編譯器使用不產生一個~X() = delete;
The Move Constructor(C++ 11)(例如,X(X&&)
)將不會被隱若產生:
X
,構造函數採用X&&
)const
,是一個參考,或已被刪除的,不可訪問,或不明確的移動構造函數)X(X&&) = delete;
The Move Assignment Operator(C++ 11)(例如:,X& operator=(X&&)
)將不會被隱若產生:
X
類,一個operator=
採取X&&
)const
,是引用或具有刪除,不可訪問或含糊不清的移動賦值運算符)X& operator=(X&&) = delete;
那麼,在所有這些第二點,它會被隱式定義,就像'delete'不產生一個d。 – 2013-03-23 19:06:55
+1不要忘記C++ 11的新增功能,您可以明確聲明它們不應該被創建('A(const A&)= delete;'),爲了完整性您應該添加Move構造函數。 – pickypg 2013-03-23 19:10:22
@pickypg:我不確定移動構造函數,如果你將我想要的信息添加到我的答案中,我會很高興 – 2013-03-23 19:11:29