C++中的左值和右值

左值与右值

左值和右值有如下3个规则:

  1. 左值和右值都是表达式。
  2. 左值是对象定位器,理论上左值指示指示一个对象。
  3. 右值是一个临时值,其他位置无法访问这个值,通常情况下在语句执行完成后右值就被丢弃。

http://c.biancheng.net/view/281.html

左值:可以进行取地址的称为左值。

右值:不能进行取地址的称为右值。右值包括:临时对象、匿名对象、临时变量、匿名变量、字面值常量(10)

左值引用

传统的左值引用:

int a = 10;
int &b = a;  // 定义一个左值引用变量
b = 20;      // 通过左值引用修改引用内存的值

左值引用在汇编层面其实和普通的指针是一样的;定义引用变量必须初始化,因为引用其实就是一个别名,需要告诉编译器定义的是谁的引用。

错误的左值引用:

int &val = 10;

10无法进行取地址操作,无法对一个立即数取地址,因为立即数并没有在内存中存储,而是存储在寄存器中,在这一行代码执行完毕后,就被丢弃了,可以通过下述方法(常引用)解决:

const int& val = 10;

// 等价于

const int temp = 10; 
const int &val = temp;

小结:

左值引用要求右边的值必须能够取地址,如果无法取地址,可以用常引用;但使用常引用后,我们只能通过引用来读取数据,无法去修改数据,因为其被const修饰成常量引用了。

由此可知,为什么很多情况下(自定义的拷贝构造函数,运算符重载等场景下)函数的参数需要用const修饰,因为为了增强代码的健壮性。如果不用const修饰,当我们在调用函数时传入一个右值就会出问题,即普通的左值引用无法绑定到右值上,必须使用常左值引用才能绑定右值。

posted @ 2023-04-05 17:56  MyXjl  阅读(121)  评论(0编辑  收藏  举报