C++11的新标准(一):左值右值和左值引用、右值引用

左值和右值

在C++11之前,虽然在C/C++中已经存在了左值和右值的概念,但是由于没有move/forward、移动构造函数等新概念的出现,我们不必深究C++标准中的左值右值的概念。但是现在的C++中,左右值已经是不得不关心的一个概念。
那么什么叫左值,什么又叫右值呢?简单来说,左值就是在源码中我们能够自己取名字的变量,右值就是我们不能自己取名字的变量。
具体而言,在C/C++中,变量究竟代表了什么?实际上,变量代表了一段地址,该地址大部分情况下是内存地址,某些情况下是寄存器编号,更极端的情况位于汇编指令中。而左值,就代表我们为这段地址取了一个名字,我们可以通过这个名字访问这段地址中的数据,而右值则是一段我们无法取名字的数据,但是该段数据又是程序运行所必须的,我称这种数据为无名数据
下面一段代码诠释了这个概念。

int a=5//a为左值,5为右值,可能位于寄存器,也可能位于内存中
class Someclass{};
SomeClass Function()
{
......
}
Someclass b=Function();//'='右边的函数返回值是一个临时对象,右值,无法取名字;执行完该表达式,该无名对象消逝

需要注意的是,右值一般代表着临时这个概念,即右值在表达式执行完成之后就消逝了。

左值引用和右值引用

在C++11之前,标准中就提到了引用的概念(这个引用也是各大高校C++教程中的引用),这里我们明确一点,左值引用就是C++11标准之前的引用。引用实际上是一个常量指针(指针指向的地址不可以修改),也就是说,无论是什么引用,其实质上都是一种数据(数据包括内容和数据类型)。
如下所示:

int x=5;
int& a=x;

//int* const b =&x;
//对a的调用等价于*b

而在C++11之后,标准中提出了右值引用的概念,如下所示:

int && a=5;
SomeClass Function()
{
......
}
Someclass&& b=Function();//'='右边的函数返回值是一个临时对象,右值,该对象位于内存中,但是我们无法取到该对象的地址

关于右值引用,我们只需要理解如下几点:

  1. 右值引用实际上是对某块内存地址取了一个名字,和左值引用不同的是这块内存地址可以是无名的
  2. 右值引用是一个左值:我们可以对右值引用取自己想要的名字,因此实际上右值引用是左值;
  3. 右值引用提升了右值的生命周期:由于我们为该无名对象取了一个名字,我们在表达式完成之后任然可以通过该名字取得无名对象的数据,因此该无名对象的生命周期必须提升至右值引用的生命周期(右值引用是左值)
  4. 右值引用可以引用左值
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值