首頁 > 後端開發 > C++ > 主體

為什麼在用另一個物件實例化一個物件時不呼叫 C 11 移動建構子?

Linda Hamilton
發布: 2024-11-05 08:20:02
原創
643 人瀏覽過

Why isn't the C  11 move constructor called when instantiating an object with another object?

C 11 移動構造函數未調用,首選默認構造函數

問題:

在C 中11、當透過另一個物件實例化一個物件時,為什麼應該呼叫的移動建構函數卻沒有被呼叫?

答案:

實例化時,編譯器可能偶爾會呼叫應用一種稱為複製省略的技術。複製省略允許直接將臨時物件建構到要複製或移動到的目標中,繞過複製或移動建構函式/析構函式對。

標準允許在以下情況下進行複製省略:

  • 返回語句:與函數返回類型具有相同cv非限定類型的非揮發性自動類型的非揮發性自動類型物件可以直接建構到返回值中。
  • 拋出表達式:範圍不超出最內層封閉 try 區塊的非揮發性自動物件可以直接建構到異常物件中。
  • 臨時物件:未綁定到引用的可以直接建構為具有相同 cv-unqualified 類型的物件。
  • 異常處理程序: 異常處理程序的異常聲明可以被視為異常的別名對象,省略複製或移動操作。

在給定的範例中,當用 X("test") 實例化 z 時,會發生複製省略,因為它被視為尚未綁定的臨時物件一個參考。因此,它被直接構造到 z 中,繞過移動構造函數並使用預設構造函數構造 z。

明確呼叫 move(X("test")) 可防止複製省略並強制使用移動建構函數,如修改後的輸出所示。

以上是為什麼在用另一個物件實例化一個物件時不呼叫 C 11 移動建構子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!