前面我们说过,形参为万能引用型别时,将根据实参的型别来决定最终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的类型一定是左值引用,否则就是右值引用。