為什麼右邊值引用變數不是右邊值?
讓我們考慮兩個重載函數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中文網其他相關文章!