繁体   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