首頁 > 後端開發 > C++ > 為什麼右值引用變數與右值引用函數簽名不符?

為什麼右值引用變數與右值引用函數簽名不符?

Mary-Kate Olsen
發布: 2024-12-10 22:46:11
原創
800 人瀏覽過

Why Doesn't an Rvalue Reference Variable Match an Rvalue Reference Function Signature?

為什麼右邊值引用變數不是右邊值?

讓我們考慮兩個重載函數f:

內功能g:

令人驚訝的是,由於t 被視為左值,因此呼叫了重載#2,儘管第一個重載具有右值引用簽章(T&&)。

如何右值引用簽章無法符合傳遞右邊值的呼叫?

理解 C 規則右值

右值通常是沒有名稱的變量,很快就會失去名稱。 T&& t 具有標識符 t,因此它是一個左值。這是有道理的,因為右值應該是短暫的並且以後不可能引用。

但是,T&& 是型別右值參考。它只能綁定到右值而不涉及靜態強制轉換,但它仍然是右值引用類型的左值。它的右值引用性質僅在其初始化和 decltype 使用期間重要。否則,它充當引用類型的左值。

靜態轉換與引用擴充

std::move(t) 執行靜態轉換回傳右值引用於t。這允許臨時值在綁定到建構函數外部的參考時具有引用生命週期擴展。

C 標準定義了處理這些場景的明確規則。右值引用和常數引用可以綁定到右邊值。當從函數傳回命名值、值沒有名稱或函數明確傳回右值參考時,會發生隱式移動。

此外,T&& 可能不會總是右值引用。如果T是X&或 X const&,引用折疊轉換 T&&到X&或 X const&。最後,T&&可以充當類型推導中的“轉發引用”,具體取決於參數的類型。

以上是為什麼右值引用變數與右值引用函數簽名不符?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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