通用引用和转发引用之间有区别吗?

时间:2016-09-17 22:24:44

标签: c++ templates perfect-forwarding universal-reference forwarding-reference

此函数的参数将绑定到右值引用:

void f(int && i);

但是,此函数的参数将绑定到右值或左值引用:

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

我经常听到这被称为普遍参考 我也听说它被称为转发参考 他们的意思是一样的吗? 如果函数体调用std::forward

,它只是转发引用吗?

2 个答案:

答案 0 :(得分:38)

  

他们的意思是一样的吗?

Universal reference是一个术语,斯科特迈耶斯创造了一个术语来描述对一个非限定模板参数进行右值引用的概念,然后可以将其推导为值或左值引用。

当时C ++标准没有特别的术语,这是对C ++ 11的疏忽,并且很难教授。 N4164补救了这种疏忽,并将以下定义添加到[temp.deduct]

  

转发参考是对cv-nonqualified模板参数的右值引用。如果P是转发引用且参数是左值,则使用类型“对A的左值引用”代替A来进行类型推导。

因此,两者意味着相同的东西,而当前的C ++标准术语是转发引用。论文本身阐明了为什么&#34;转发参考&#34;是一个比通用参考更好的术语。&#34;

  

如果函数体调用std::forward

,它只是转发引用吗?

不,你使用转发引用做的事与名称无关。概念转发参考仅涉及如何推导类型T

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

无需随后转发。

答案 1 :(得分:14)

不幸的是,它令人困惑,但它们只不过是同一件事的两个名字 Meyers很久以前就提出了我的通用参考(我猜)(见here为例) 转发参考直接从标准中获取。就是这样。