浅谈左值和右值

前言

如果你了解过左值和右值的概念,在网络上看过一些博客的解释,会发现有些博客会将它解释为

左值就是在赋值语句左边的东西,右值就是在右边的东西

但这是错的,不能从字面上理解这个概念,这篇博客会告诉你左值和右值的定义,以及为什么右值引用会出现,右值引用存在的意义是什么。在阅读本文之前,需要先大概阅读一下参考的文献

正文

前置知识

对象和值

左值和右值的定义

首先,举个例子

int func(int num){
	return num+1;
}
int main(){
	int a;
	a = 1;
	int b[3];
	int *p = &b;
	*(p+1) = func(a); //*(p+1)为左值,func(a)的返回值为右值
	*(p+2) = a+1;//a+1为右值
}


在赋值语句a = 1a是一个左值,1是一个右值,为了好理解,我们先给出左值和右值的性质

  1. 左值可以出现在等号左边也可以出现在等号右边,右值只能在右边。
    例如int b = a,a作为左值出现在等号右边
  2. 当左值出现在等号左边时,它的含义是所代表的一段连续内存。
  3. 当左值出现在等号右边时,它的含义是所代表的一段连续内存中的值。

现在我们给出定义

当我们看到一个值,这个值是存储在内存当中的(即可寻址),那么这个值就是左值

常见的左值
声明一个对象,int a
对指针进行简单运算后解引用,*(p+1)
常见的右值
函数的返回值
大多数表达式的值

右值引用为什么会出现

  1. 为了体现移动语义
    虽然可以拷贝构造函数加一个参数来实现[1],但是不优雅
  2. C++编译器完全可以让int &类型的变量用右值来初始化
    可能问题在于会和引用和常量引用的语法解释[2]有冲突,如果允许int &a = 1这种语法存在,那就不能将引用解释为别名,因为1是常量不可修改,a作为常量的别名竟然可以修改,这是不能理解的,所以引入了右值引用

右值引用存在的意义

让c++优雅地支持了移动语义,但是否进行移动,还需要看实现,右值引用只是起到表达移动语义的作用


  1. 一文读懂C++右值引用和std::move ↩︎

  2. int &a = b的意思是a是b的一个别名,a就代表变量b
    const int &a = 1的意思是a就是1的一个别名,a代表常量11是不可改变的 ↩︎

posted @ 2023-01-14 14:58  你是木木吗  阅读(316)  评论(0)    收藏  举报