維基百科有關special member functions的文章不包含任何有關移動構造函數和移動賦值運算符的引用。C++中的特殊成員函數0x
我想更新條目,但我不確定0x標準說什麼。
關於這兩個功能的規則是什麼?它們是否由編譯器自動生成,如果是的話?
編輯:我已經更新的維基百科頁面,如果有人感覺就像是請編輯成形狀(如果需要),幫助社區。
維基百科有關special member functions的文章不包含任何有關移動構造函數和移動賦值運算符的引用。C++中的特殊成員函數0x
我想更新條目,但我不確定0x標準說什麼。
關於這兩個功能的規則是什麼?它們是否由編譯器自動生成,如果是的話?
編輯:我已經更新的維基百科頁面,如果有人感覺就像是請編輯成形狀(如果需要),幫助社區。
牢記C++ 0x目前還不是很標準,這可能會有所變化。從FCD(PDF鏈接),移動構造函數和移動賦值運算符確實可以明確地拖欠,甚至隱含違約。*****
我只是引用(大量刪節)一串的東西,可能會對有用一覽:
在明確,違約功能,§8.4.2/ 1-2:
是明確違約函數應
- 是一個特殊的成員函數,
- 具有相同的聲明的函數類型,就好像它已經隱含聲明,
- 沒有默認參數,並
- 沒有一個例外的規範。
如果明確拖欠首次聲明,
- 應當是公開的,
- 不得是明確的,
- 不得是虛擬的,
- 是隱含地認爲具有相同的異常規範,就好像它已被隱式聲明(15.4),並且在複製構造函數,移動構造函數,副本的情況下,
- 賦值運算符或移動賦值運算符,它應該具有與隱式聲明相同的參數類型。
在特殊成員函數,§12/ 1:
默認構造(12.1),拷貝構造和拷貝賦值運算符(12.8),移動構造函數和移動賦值運算符(12.8)和析構函數(12.4)是特殊的成員函數。 [注意:當程序沒有明確聲明它們時,實現會隱式地爲一些類類型聲明這些成員函數。如果使用它們,實現將隱含地定義它們。見12.1,12.4 和12.8。末端注]
關於隱式聲明的功能,§12.8/ 8-11:
如果類定義不明確聲明拷貝構造函數和沒有用戶聲明的移動構造函數,一個拷貝構造函數被隱式聲明爲默認(8.4)。
一類X中的隱式地聲明的複製構造將具有
X::X(const X&)
如果
- X的每個直接或虛擬基類B具有拷貝構造,其第一個參數是
const B&
型或const volatile B&
的形式,並- 對於類型爲M(或其數組)的X的所有非靜態數據成員,每個這樣的類類型都有一個拷貝構造函數,其第一個參數的類型爲
const M&
或const volatile M&
。否則,隱式聲明的拷貝構造函數的格式將爲
X::X(X&)
。如果類定義不明確宣佈一個移動構造函數,一個將被隱式聲明爲默認,當且僅當
- X沒有一個用戶聲明的拷貝構造函數和
- 移動構造不會被隱式定義爲刪除。
[注意:當移動構造函數未被隱式聲明或顯式提供時,否則將調用移動構造函數的表達式可能會調用複製構造函數。 - 注意]
類X的隱式聲明移動構造函數的格式爲
X::X(X&&)
。
在暗中刪除默認功能,§12.8/ 12:
隱式聲明的複製/移動的構造是其類的內聯公共成員。一類X A拖欠禁止複製/移動的構造被定義爲刪除(8.4.3)如果X具有:
- 與非平凡的相應的構造的變型構件和X是聯合狀類,
- 類型爲M(或其數組)的非靜態數據成員無法複製/移動,因爲應用於M的相應構造函數的重載解析(13.3)會導致模糊或函數被刪除或無法訪問默認的構造函數或者由於應用於B的相應構造函數的重載解析(13.3)而不能複製/移動的直接或虛擬基類B導致歧義或函數從默認構造函數中刪除或無法訪問,或者對於移動構造函數,非靜態數據成員或直接或虛擬基類具有不具有移動構造函數並且不可平分複製的類型的
- 。
§12.8/ 13-18定義了函數在隱式生成時應如何工作。
§12.8/ 19然後做與§12.8/ 8相同的事情,除了複製分配和移動賦值操作符。它們足夠相似,不需要在這裏引用。
要獲得更完整的圖片,您需要完整閱讀這些部分,但這是一般想法。我很高興我們得到隱式移動語義。
*但是像默認的複製功能,它們可能並不總是有正確的行爲!三巨頭應該成爲大五。 (例如,當我們需要深度複製某些東西的時候,三巨頭就會實現,我們還需要確保我們做了一個「深度移動」,其中源數據是空值/重置的,這是而不是隱式完成的。 )
您應該嘗試查找最新版本的草稿。 AFAIK,它們不會自動生成,但(希望)可以請求默認版本('X(X &&)= default;') – visitor 2010-07-19 11:56:03