RaG*_*__M 23 c++ templates c++11 c++14 forwarding-reference
我一直在阅读Scott关于c ++ 11和14的最后一篇大师文章中的通用引用,尽管有一个参数分配给左值或右值类型的参考参数,但在它们之间存在一些被称为通用引用的东西,它可以推导出来l/rvalue基于传递的参数的类型特征.我可以理解是什么使得参数成为通用引用但是我不清楚的一个原因是为什么在类型参数中添加const const T&& p
使得p为rvalue:
template<typename T>
void f(T&& param); // param is an universal reference
template<typename T>
void f(const T&& param); // param is an rvalue reference
Run Code Online (Sandbox Code Playgroud)
const
分配给参考参数时,是否会执行此操作.
Tem*_*Rex 17
官方名称不是通用参考,而是转发参考.该标准规定,只有右值引用CV-不合格模板参数属于这一类:
14.8.2.1从函数调用中减去模板参数[temp.deduct.call]
3如果P是cv限定类型,则类型推导将忽略P类型的顶级cv限定符.如果P是引用类型,则P引用的类型用于类型推导.转发引用是对cv-unqualified模板参数的rvalue引用.如果P是转发引用且参数是左值,则使用类型"对A的左值引用"代替A来进行类型推导.[例如:
Run Code Online (Sandbox Code Playgroud)template <class T> int f(T&& heisenreference); template <class T> int g(const T&&); int i; int n1 = f(i); // calls f<int&>(int&) int n2 = f(0); // calls f<int>(int&&) int n3 = g(i); // error: would call g<int>(const int&&), which // would bind an rvalue reference to an lvalue
- 结束例子]
允许const T&&
表现为转发引用,将使得仅将rvalue引用作为参数的模板函数重载成为不可能.
更新:正如@HowardHinnant在评论中提到的,const T&&
确实有其用途(另请参阅此问答).