首頁 >後端開發 >C++ >C 中何時自動產生移動建構函數和移動賦值運算子?

C 中何時自動產生移動建構函數和移動賦值運算子?

Patricia Arquette
Patricia Arquette原創
2024-11-28 05:23:13869瀏覽

When Are Move Constructors and Move Assignment Operators Automatically Generated in C  ?

C 中的移動操作產生

在C 98 中,為沒有自訂定義的類別自動產生複製構造函數和賦值運算符。然而,隨著 C 11 中移動語意的引入,移動操作的產生需要進一步考慮。

自動產生移動操作

移動建構子和移動賦值運算子僅在滿足某些條件時自動產生:

  • 預設移動語意: 編譯器產生執行物件資料成員位元移動的移動操作。
  • 沒有使用者定義的析構函數: 如果類別具有使用者定義的析構函數,則編譯器不會自動產生移動操作。
  • 沒有使用者定義的複製操作:同樣,如果一個類別有使用者定義的複製操作,編譯器不會自動產生移動操作。

自動產生的例外

在某些情況下,不會自動產生行動操作,即使滿足上述條件。例如:

  • 具有僅移動類型的類別成員:如果類別包含具有僅移動類型(即無法複製的類型)的成員,編譯器無法自動產生移動操作。
  • 簡單類別:僅包含簡單資料成員的類別(例如,整數、字串)具有隱式定義的複製和移動操作,因此編譯器不會產生自訂實作。

其他資訊

來自ACCU 的Howard Hinnant 示範2014年會議提供了一個綜合表格,總結了自動產生特殊成員的規則,包括行動操作。幻燈片突出顯示,已棄用的行為以紅色方塊表示。

為了確保正確處理移動語義,建議遵循 C 98/03 中的「3 規則」。這意味著如果聲明了析構函數,則明確聲明兩個複製成員,或聲明至少一個複製成員。

以上是C 中何時自動產生移動建構函數和移動賦值運算子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn