C++右值引用

一、左值和右值

左值:指表达式结束后依然存在的持久对象

右值:表达式结束就不再存在的临时对象

简单来说就是,左值相当于地址值,右值相当于数据值。

int i=42;
int &r=i;   //正确,r引用i
int &&rr=i   //错误,不能将一个右值引用绑定到一个左值上
int &r2=i*42;  //错误,i*42是一个右值
const int &r3=i*42;  //正确,我们可以将一个const的引用绑定到一个右值上
int &&r2=i*42; //正确,将rr2绑定到乘法结果上

右值引用和左值引用的区别:

  • 左值引用不能绑定到要转换的表达式、字面常量或返回右值的表达式。右值引用恰好相反,可以绑定到这类表达式,但不能绑定到一个左值上。
  • 右值引用必须绑定到右值的引用,通过 && 获得。右值引用只能绑定到一个将要销毁的对象上,因此可以自由地移动其资源。

注意!变量是左值 :不能将一个右值引用绑定到一个变量上,即使这个变量是右值引用类型也不可以。

int &&rr1 =42;  //正确,字面值常量是右值
int &&r2 =rr1;   //错误,表达式rr1是左值!

二、标准库move函数

std::move 可以将一个左值强制转化为右值,继而可以通过右值引用使用该值,以用于移动语义。

int &&rr1 =42;  //正确,字面值常量是右值
int &&rr3 =std::move(rr1);  //OK

注意: 可以销毁一个移后源对象,也可以赋予它新值,但是不能使用一个移后源对象的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值