std::move和std::forward

std::move

将一个左值强制转换成右值引用,基本等同static_cast<T&&>lvalue,只是做了类型转换。std::move+移动构造函数或移动复制运算符,才能起到减少不必要拷贝。
在这里插入图片描述

右值引用

c++引用右值引用之后,可以通过右值引用,充分使用临时变量,减少不必要的拷贝,提高效率。
右值引用、移动构造函数、移动赋值运算符、std::move的引入,可以充分利用优质资源,减少不必要的拷贝。
如:
1、使用vector::push_back等函数时,会调参数对象的拷贝构造;使用std::move,可以避免不必要的拷贝操作。

移动构造

b=std::move(a)
通过移动构造,b拥有了a的资源,a不再拥有资源。调移动构造之后,访问a的行为是未定义的,比如根据移动构造的语义,可以是空指针,如果资源是std::string被移动后是空字符串。

//移动构造函数的列子
RValue(RValue&& a) {
		sources = std::move(a.sources);
		cout<<"&& RValue"<<endl;
	}

std::move使用场景

使用前提

1、定义的类使用了资源,并且定义了移动构造函数和移动拷贝运算符,
2、该变量即将不再使用

注意事项

1、被const修饰的变量,std::move之后,传参数调构造,还是会调到拷贝构造函数

void put(const RValue c){
	cout<<"put----------"<<endl;
	unique_ptr<RValue> up(new RValue(std::move(c)));
	cout<<"put----------"<<endl;
}
    RValue c;
    put(std::move(c));
/*输出
    put----------
& RValue
put----------*/

参考资料

1、std::move
添加链接描述

std::forward

完美转发实现了参数在传递过程中,保持其属性的功能。即,若是左值,传递之后仍是左值,若是右值,则传递之后,仍是右值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值