C++进阶学习(三):std::move的使用

左值、右值、左值引用和右值引用

在C++11里值要么是左值,要么是右值。
左值:能被取地址的、有名称的值。
右值:不能被取地址的值,包括临时变量,函数的返回值

int a=2;//a是左值,2是右值
int b=3;//b是左值,3是右值
int c=(a+b);//c是左值,(a+b)是右值

左值引用(C++98允许的引用):
语法:数据类型 & 数据名称=左值;
右值引用(C++11新增特性):
语法:数据类型&& 数据名称=右值;

  • 左值引用对应左值,右值引用对应右值
	int a = 2;
	int b = 3;
	int& d = (a + b);//编译错误,(a+b)是一个右值,不能进行左值引用
	int&& e=a;//编译错误,a是个左值,不能进行右值引用
	int&& c=(a+b);//编译通过,c代表的是值5,即使a或者b改变,c也不会改变

在int t=(a+b);这个语句中会先生成一个(a+b)的临时变量,将临时变量的值赋给t,在这一行代码执行完后就会消去临时变量。通过int&& c=(a+b)实际上是将这个临时变量的生命周期延长了。只要c的生命周期不结束,这个临时变量就存活下去。

  • 左值引用和右值引用都必须立即初始化。
  • 左值引用和右值引用都是给变量起别名,左值引用是给具名变量起别名,右值引用是给匿名变量起别名。

std::move

头文件:utility.h
std::move的作用:std::move可以将一个左值强制转换为右值引用,相当于static_cast<T&&>(lvalue)。

int a=2;
int&& e=std::move(a);//编译通过

被转换的左值,生命周期并没有随着左右值的转化而转变。左值lvaule并不会被立即析构。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值