該函數的自變量將結合到一個rvalue參考:通用引用和轉發引用是否有區別?
void f(int && i);
然而,一個參數這個功能將結合到任何一個rvalue或左值參考:
template <typename T>
void f(T && t);
我經常已經聽說這被稱爲通用參考。
我也聽說它被稱爲轉發參考。
他們的意思是一樣的嗎?
如果函數體調用std::forward
,它只是一個轉發參考嗎?
該函數的自變量將結合到一個rvalue參考:通用引用和轉發引用是否有區別?
void f(int && i);
然而,一個參數這個功能將結合到任何一個rvalue或左值參考:
template <typename T>
void f(T && t);
我經常已經聽說這被稱爲通用參考。
我也聽說它被稱爲轉發參考。
他們的意思是一樣的嗎?
如果函數體調用std::forward
,它只是一個轉發參考嗎?
他們的意思是一樣的嗎?
Universal reference是一個術語斯科特邁爾斯鑄造描述的服用一個rvalue參照CV-不合格模板參數,然後可以推導出一個值或左值參考的概念。
當時C++標準沒有一個特殊的術語,這是C++ 11中的一個疏忽,並且很難教。這種監督被糾正由N4164,它增加了以下定義[temp.deduct]:
甲轉發參考是一個rvalue參照CV-不合格模板參數。如果
P
是轉發引用並且參數是左值,則使用類型「左值引用A」來代替類型推導中的A.
因此,兩者意味着同樣的事情,而當前的C++標準術語是轉發引用。該論文本身闡明瞭爲什麼「轉發參考」是一個比「通用參考」更好的術語。
如果函數體調用
std::forward
,它只是一個轉發參考嗎?
不,您對轉發參考所做的操作與名稱無關。概念轉發參考僅僅指的是怎樣類型T
中推導出:
template <class T> void foo(T&&); // <==
它並不需要在隨後被轉發。
不幸的是,這是令人困惑的,但它們只不過是兩個同名的名字。
Meyers遠在前面提出了一個通用參考(我猜)(參見here作爲例子)。
轉發基準直接從標準中選取。就這樣。
有關某些背景材料,請參閱https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers。 –
@SamVarshavchik你真的讀過這個問題或博客嗎? – Barry