簡體   English   中英

通用引用和轉發引用之間有區別嗎?

[英]Is there a difference between universal references and forwarding references?

此函數的參數將綁定到右值引用:

void f(int && i);

但是,此函數的參數將綁定到右值或左值引用:

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

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

他們的意思是一樣的嗎?

通用引用是 Scott Meyers 創造的一個術語,用於描述將右值引用應用於 cv 非限定模板參數的概念,然后可以將其推導出為值或左值引用。

當時 C++ 標准對此沒有專門的術語,這是 C++11 中的一個疏忽,因此很難教授。 N4164糾正了這種疏忽,將以下定義添加到[temp.deduct]

轉發引用是對 cv 非限定模板參數的右值引用。 如果P是轉發引用並且參數是左值,則使用類型“對 A 的左值引用”代替 A 進行類型推導。

因此,兩者的含義相同,當前的 C++ 標准術語是轉發引用。 論文本身闡明了為什么“轉發參考”比“通用參考”更好。

如果函數體調用std::forward ,它只是一個轉發引用嗎?

不,您對轉發引用所做的操作與名稱無關。 概念轉發引用只是指類型T是如何推導出來的:

template <class T> void foo(T&& ); // <== 

它不需要隨后轉發。

不幸的是,這令人困惑,但它們只不過是同一事物的兩個名稱。
Meyers 很久以前就提出了通用參考(我猜)(請參見此處作為示例)。
轉發參考是直接從standardese中提取的。 就這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM