此函数的参数将绑定到右值引用:
void f(int && i);
但是,此函数的参数将绑定到右值或左值引用:
template <typename T>
void f(T && t);
我经常听说这是一个通用的参考。
我还听说它被称为转发参考。
它们的意思是一样的吗?
如果函数体调用std::forward
,它是否只是一个转发引用
发布于 2016-09-18 06:34:25
它们的意思是一样的吗?
Universal reference是Scott Meyer创造的一个术语,用于描述对cv非限定模板参数进行右值引用的概念,然后可以将其推导为值或左值引用。
当时,C++标准没有专门的术语来描述这一点,这是C++11中的一个疏忽,使得教学变得困难。N4164纠正了这一疏忽,它向[temp.deduct]添加了以下定义
转发引用是对cv未限定模板参数的右值引用。如果
P
是转发引用,而参数是左值,则使用“左值对A的引用”类型代替A进行类型推导。
因此,这两者的含义是一样的,并且当前的C++标准术语是转发引用。这篇论文本身阐明了为什么“转发参考”是一个比“通用参考”更好的术语。
如果函数体调用std::forward
,
是否只是一个转发引用?
不,你对转发引用做了什么与名字无关。概念转发引用只是指类型T
是如何在中推导出来的:
template <class T> void foo(T&& ); // <==
它不需要随后转发。
发布于 2016-09-18 06:32:20
不幸的是,这很令人困惑,但它们只不过是同一事物的两个名称。
通用参考( Universal reference )是Meyer很久以前提出的(我猜是这样的)(例如here )。
转发引用是直接从标准代码中提取的。就这样。
https://stackoverflow.com/questions/39552272
复制相似问题