浅谈左值和右值
前言
如果你了解过左值和右值的概念,在网络上看过一些博客的解释,会发现有些博客会将它解释为
左值就是在赋值语句左边的东西,右值就是在右边的东西
但这是错的,不能从字面上理解这个概念,这篇博客会告诉你左值和右值的定义,以及为什么右值引用会出现,右值引用存在的意义是什么。在阅读本文之前,需要先大概阅读一下参考的文献
正文
前置知识
对象和值
左值和右值的定义
首先,举个例子
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 = 1中a是一个左值,1是一个右值,为了好理解,我们先给出左值和右值的性质
- 左值可以出现在等号左边也可以出现在等号右边,右值只能在右边。
例如int b = a,a作为左值出现在等号右边 - 当左值出现在等号左边时,它的含义是所代表的一段连续内存。
- 当左值出现在等号右边时,它的含义是所代表的一段连续内存中的值。
现在我们给出定义
当我们看到一个值,这个值是存储在内存当中的(即可寻址),那么这个值就是左值
常见的左值
声明一个对象,int a
对指针进行简单运算后解引用,*(p+1)
常见的右值
函数的返回值
大多数表达式的值
右值引用为什么会出现
- 为了体现移动语义
虽然可以拷贝构造函数加一个参数来实现[1],但是不优雅 - C++编译器完全可以让
int &类型的变量用右值来初始化
可能问题在于会和引用和常量引用的语法解释[2]有冲突,如果允许int &a = 1这种语法存在,那就不能将引用解释为别名,因为1是常量不可修改,a作为常量的别名竟然可以修改,这是不能理解的,所以引入了右值引用
右值引用存在的意义
让c++优雅地支持了移动语义,但是否进行移动,还需要看实现,右值引用只是起到表达移动语义的作用
int &a = b的意思是a是b的一个别名,a就代表变量b
const int &a = 1的意思是a就是1的一个别名,a代表常量1,1是不可改变的 ↩︎

浙公网安备 33010602011771号