c++11中增加了新特性,那就是参数的转发。有时候我们希望在一个函数中调用另一个函数,如下列模板:
template <typename F,typename T1,typename T2>
void Func(F f,T1 t1,T2 t2){ f(t1,t2); }
如果我们需要的都是传值的也好说,但是如果F这个函数传的是引用,而t1,t2都是被拷贝过来的。
我们引用的是一个函数中的局部变量,无法影响到真正想要影响的对象。
这里有一个解决办法,在函数模板推导模板实参时,由于引用叠加特性,我们对T1,T2声明成为右值引用形式,那么实参可以保证原来的状态。
如:
template <typename F,typename T1 ,typename T2>
void Func(F f,T1 &&t1,T2 &&t2){ f(t1,t2);}
在上面的函数模板中,如果传入t1位置的是个左值,那么将是对t1的左值引用,如果他是右值,就是对他的右值引用。
这足以解决不少问题,但是离完美转发还是差了一步!如果我们传入一个右值,t1确实是右值引用,但是不幸的是他还是个变量,也就他依然是左值!
如果我们的f需要右值(参数是右值引用),我们也给他传入了右值,但是依然会出错,因为右值引用无法绑定到左值上。
原来的解决办法是用std::move,他会返回右值,但是无论你原来是什么类型,他都会返回右值,而我们这里是要建立一个模板,是希望完美转发!原来是左值,现在确是右值&#