十七、C++11常用新特性—转移和完美转发(move、forward)

move

c++11中添加了右值引用,不能使用左值来初始化右值引用,如果想要使用左值初始化一个右值需要借助std::move()函数,使用std::move/方法可以将左值转换为右值,使用这个函数并不能转移任何东西,而是和移动构造函数一样都具有移动语义,将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。

使用示例:

直接将变量a初始化一个右值引用的b是错误的,因为a是一个左值,但是使用了move之后可以将a转换成一个右值,将a的资源转移给c;

还可以用于容器的值转移:

使用std::move可以避免了拷贝,提高效率。另外,我们可以给类编写相应的移动构造函数(T::T(T&& anonter))和具有移动语义的赋值函数(T&&T::operator=(T&&rhs)),在构造对象和赋值的时候尽可能的进行资源的重复利用,因此他们都是接收一个右值引用的效果。

forward 

右值引用是独立于值的,一个右值应用作为函数参数的形参时候,在函数内部转发该参数给内部其他函数时,他就变成了一个左值,并不是原来的类型了,如果需要按照参数原本类型转发到另一个函数,可以使用std::forward函数,该函数实现的功能称为完美转发。

std::forward<T>(t);

当T为左值引用类型时,t将被转换为T类型的左值。

当T不是左值引用类型时,t将被转换为T类型的右值。 

------------------------------------------------

上述如有错误欢迎大家指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值