前言
在学习C++的过程中,我一直对左值(lvalue)和右值(rvalue)的概念模糊不清,所以有了这篇文章。
左值和右值的定义
在C++中,左值它是指向一个内存地址的,右值是则没有指向任何内存地址。这就造成了右值是短暂和短命的。而左值则能活很久,因为它是以变量(variable)的形式存在的。可以把左值看作一个容器(container),而右值是容器里面的事物。容器消失了,里面的事物就会消失。
int a = 60; //a是左值,60则是右值
在这里,60是一个右值,一个数字(字面常量(literal constant))它没有指定的内存地址,在程序运行时它储存在临时的寄存器外,在该例中,60被赋予(assign)给a,a是一个变量,一个变量(specific)有着具体的内存位置,所以它是一个左值。C++中声明赋值(assignment)需要一个左值作为它的左操作数(left operand);这完全合法的。
对于左值a,你可以做这样的操作:
int* b = &a; //ok
在这里我通过地址操作符&获取了a的内存地址并且把它放进b,&操作符需要一个左值且产生一个右值,这也是完全合法的操作,在赋值操作符左边我们有一个左值,在右边我们使用取址操作符产生右值。
然而,我们不能这样写:
int y;
60 = y; //error
上面的错误显而易见,但从技术上来说60是一个字面常量也就是一个右值,它没有一个具体的内存地址(memory location),所以它会把y分配到一个不存在的地方。导致程序错误。
下面是GCC给出的变异错误提示:
error: lvalue required as left operand of assignment
赋值的左操作符需要一个左值,这里我们使用了一个右值60
我们也不能这样做:
int* a = &60; //error
GCC给出了以下错误提示:
error: lvalue required as unary '&' operand
`
&操作符需要一个左值,因为右值它没有具体的内存地址,在进行取址操作时,会发生取不到地址的错误。
返回左值和右值的函数
待更新
参考博客 internalpoiners ==点击==