23

該函數的自變量將結合到一個rvalue參考:通用引用和轉發引用是否有區別?

void f(int && i); 

然而,一個參數這個功能將結合到任何一個rvalue或左值參考:

template <typename T> 
void f(T && t); 

我經常已經聽說這被稱爲通用參考。
我也聽說它被稱爲轉發參考。
他們的意思是一樣的嗎?
如果函數體調用std::forward,它只是一個轉發參考嗎?

+1

有關某些背景材料,請參閱https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers。 –

+1

@SamVarshavchik你真的讀過這個問題或博客嗎? – Barry

回答

25

他們的意思是一樣的嗎?

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&&); // <== 

它並不需要在隨後被轉發。

+1

好的答案!你有什麼(不平凡的)例子,你不會在轉發引用上調用'std :: forward'嗎?你也可以提到局部變量的'auto &&'情況。 – vsoftco

+1

@vsoftco'template void foo(F && arg){use(arg); use_again(ARG);消耗(std :: forward (arg)); }' – Barry

+0

不言自明,謝謝,雖然你還是以一個前鋒:) – vsoftco

9

不幸的是,這是令人困惑的,但它們只不過是兩個同名的名字。
Meyers遠在前面提出了一個通用參考(我猜)(參見here作爲例子)。
轉發基準直接從標準中選取。就這樣。

相關問題