只是忽然被卡到这个概念了,做一个简单总结。后边推进到左值引用右值引用可能会好好讲一下。
左值与右值与C++中的很多基础概念一样,是自C语言传承而来的。
在C语言中:
左值通常是指既能出现在等号左边,又可以出现在等号右边的变量或表达式;右值是指只能出现在等号右边的变量或表达式。
就像我们可以将将两个数求和赋给另一个数写成 a = b + c,但是我们不能将它写做 b + c = a。
要从数学方程式的角度来看这的确是正确的,但我们是在编程,C/C++给用户规定的最为基础的操作规则是不容触犯的。
在C语言中,通常可以认为有名字的变量都是左值,而const常量等具有常性的值,以及计算过程中产生的中间值则是右值。
除非对象是位字段(嵌入式编程中常用的一种概念)或者被声明为寄存器存储,一个左值中必定可以解析出对应对象的地址。
比如我们定义一个变量
int a = 3;
这里的a即是一个左值,它在内存中占用了具体的内存空间,我们可以根据其地址找到它,并且,最重要的一点,a的值是可以改变的。
左值与右值最大的差别在于左值可以修改,而右值不可以——就像我们不能令 3 = 4 一样。
&a
所以,以上这个&a就是个右值,因为我们只是通过取地址符号临时获取了a的地址,我们并不能对其进行修改,并且所取出来的这个地址的值,我们是无法找到其地址的,即&&a不存在——这里是取两次地址,可不是右值引用。