浅识:【C++11】右值引用

引入右值引用的目的:为了支持移动操作和完美转发。目的:解决临时对象的问题,提高效率。
#####区分左值和右值:
左值跟右值都是针对表达式而言的;
左值:指表达式结束后依然存在的持久对象,变量是左值。
右值:指表达式结束时就不再存在的临时对象,右值是可以取出地址的,要么是字面常量,要么是表达式求值过程中创建的临时对象。
左值持久,右值短暂
右值是C++从C继承来的概念,最初是指=号右边的值。但现在C++中的右值已经与它最初的概念完全不一样了。在C++中右值指的的临时值或常量,更准确的说法是保存在CPU寄存器中的值为右值,而保存在内存中的值为左值

例子:对于int a = 10;
######++a和a++的区别:
a++:先将a的持久对象拷贝一份,然后是持久对象a的值+1;最后返回的是那份拷贝的对象;所以他是右值。
++a:直接使持久对象的值+1,返回持久对象,所以他是左值。

所谓右值引用就是必须绑定到右值的引用。我们通过&&而不是&来获取右值引用。
重要性质:只能绑定一个将要销毁的对象。

int a = 10;		//a为左值,10为右值
int &r = a;		//正确:r引用a
int &&rr = a;	//错误:不能将一个右值引用绑定到一个左值上
int &r1 = a * 42;//错误:a*42是一个右值(当前语句执行完后a*42的值就不在了)
const int& r2 = a * 42;//正确:可以将一个const的引用绑定到一个右值上。
int &&rr1 = a * 42;//正确:将rr1绑定到乘法结果上

######不能将一个右值引用绑定到一个右值引用类型的变量

int &&rr2 = 42;//正确:字面常量是右值
int &&rr3 = rr1;//错误:表达式rr1是左值,无法将右值引用绑定到左值

变量是左值;不能将一个右值引用直接绑定到一个变量上,即使这个变量是右值引用类型也不行

#####标准move函数:
解决不能将一个右值引用绑定到一个左值的方法
1,显示地将一个左值转换为对应的右值应用类型:
例如:

int a = 10;
int && rr = (int &&)a; //正确

2,调用move函数,获得绑定到左值上的右值引用。
例如:

const int a = 10;
int &&rr1 = 10;
int &&rr2 = std::move(a);//正确
int &&rr3 = std::move(rr1);正确

move告诉编译器:我们有一个左值,但是我们希望像一个右值一样处理它。
我们必须认识到,调用move就意味着有一个承诺:除了对 rr1 赋值或者销毁它外,我们将不能在使用,调用move后,我们不能对移后源对象的值做任何假设。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值