首頁 >後端開發 >C++ >C 編譯器何時會自動產生移動建構函式和賦值運算子?

C 編譯器何時會自動產生移動建構函式和賦值運算子?

DDD
DDD原創
2024-12-19 09:34:10282瀏覽

When Do C   Compilers Automatically Generate Move Constructors and Assignment Operators?

C 中自動產生移動操作

在C 98 中,編譯器可以自動為類別產生複製建構子和複製賦值運算子。然而,隨著 C 11 中移動語意的引入,關於移動操作自動產生的問題出現了。

移動建構子和移動賦值運算子會自動產生嗎?

否,與複製建構子和複製賦值運算子不同,編譯器不會自動為具有使用者定義建構子或賦值的類別產生移動操作

不自動產生移動操作的情況

如果滿足以下條件,則不會自動產生移動操作:

  • 該類別有用戶-定義的建構子或複製建構子。
  • 該類別有使用者定義的賦值運算子或複製賦值運算子。
  • 該類別有一個非平凡的析構函數。
  • 該類別有一個帶有非平凡析構函數的基底類別。
  • 該類別包含一個不可複製或不可移動成員。

確定自動產生Move操作

要確定是否為類自動產生移動操作,請考慮以下事項:

  • 如果類別只有預設建構函數而沒有使用者定義的建構子或賦值運算符,產生移動操作。
  • 如果類別有使用者定義的建構子或賦值運算符,則必須明確宣告移動操作。
  • 如果類別具有非平凡析構函數或具有非平凡析構函數的基類,則必須明確聲明移動操作。

棄用自動移動操作的產生

在C 20 中,不建議自動產生行動操作,如果該類別聲明析構函數或任何複製成員(複製建構子、複製賦值運算子)。為了確保與 C 未來版本的兼容性,建議為需要它們的類別明確聲明移動操作。

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

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