关于c++11转发(std::forward)

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,他会返回右值,但是无论你原来是什么类型,他都会返回右值,而我们这里是要建立一个模板,是希望完美转发!原来是左值,现在确是右值&#

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值