template<typename T>
void f(T&& param)
{
std::cout<<param;
}
f(10); // 10是右值 int &&
int x = 10;
f(x); // x是左值 int &
以上这种万能引用类型(param的类型)能万能引用不同类型的参数,这种类型必须被初始化,而它是左值还是右值则取决于它的初始化,如果被左值初始化,那么它就是左值,反之亦然。那么什么时候是左值,什么时候是右值,就需要进行类型推导才知道。
有的人会问,我传入的是一个左值a,并不是一个左值引用,为什么编译器会推导出T 为int &呢。首先,模板函数参数为 T&& param,也就是说,不管T是什么类型,T&&的最终结果必然是一个引用类型。如果T是int, 那么T&& 就是 int &&;如果T为 int &,那么 T &&(int& &&) 就是&,如果T为&&,那么T &&(&& &&) 就是&&。很明显,接受左值的话,T只能推导为int &。
总结一下,万能引用就是利用模板推导和引用折叠的相关规则,生成不同的实例化模板来接收传进来的参数。
————————————————
版权声明:本文为CSDN博主「kupeThinkPoem」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kupepoem/article/details/119944958