首頁 > 後端開發 > C++ > 為什麼 `T&&` 的行為並不總是像真正的右值引用?

為什麼 `T&&` 的行為並不總是像真正的右值引用?

Linda Hamilton
發布: 2024-11-30 06:21:15
原創
395 人瀏覽過

Why Doesn't `T&&` Always Behave Like a True Rvalue Reference?

為什麼 T&& 的行為不像右邊值引用?

使用 void f(T&&) 和 void f(T& 等函數重載時),令人驚訝的是,當傳入 T&& 時會呼叫 f(T&),儘管反之則不然。這是由於 C 中右值所引用的行為造成的。

與直覺相反,T&& 不只是一個右值引用。它是右值參考類型,這意味著它只能綁定到右值,但在其他方面的行為類似於右值引用類型的左值。這種綁定行為確保沒有名稱的物件和即將失去名稱的物件自動被視為右值。

但是,由於 T&& 有名稱(即 t),因此它被視為左值,因此調用 f( T&) 過載。使用 f(static_cast(t)) 將 t 靜態轉換為 T&&&&&&>(t)) 是呼叫右邊值參考重載 f(T&&) 所必需的。

總而言之,管理此行為的C 規則是:

  • 當從函數傳回命名值、值沒有名稱或函數明確傳回右邊值時,會發生隱含移動引用。
  • 只有右邊值引用和 const& 可以綁定到右邊值。
  • 直接綁定到構造函數外部的引用時,會發生臨時值的引用生命週期擴展,並且適用於右值引用和 const&。
  • T&& 並不總是右值引用;根據 T 的類型,它可能會折疊為 X&、X const& 或 X const&&。
  • T&& 可以在型別推導上下文中充當“轉發引用”,根據參數的類型推導 T。

以上是為什麼 `T&&` 的行為並不總是像真正的右值引用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板