前面我们说过,形参为万能引用型别时,将根据实参的型别来决定最终param的型别:
template<class T> void func(T&& param) { //do something } Widget w; func(w); //w为左值,T为Widget&,param为Widget& func(Widget());//实参为右值,T为Widget,param为Widget&&
之所以会有上面结果的推导结果,就是因为引用折叠的存在,同样,std::forward中也深刻践行了引用折叠,具体原理,可以参考书籍。这里直接给出结论:只要T的型别为左值,则param的类型一定是左值引用,否则就是右值引用。