C++表达式中不是左值就是右值,所以能理解左值和右值这两个概念对我们的编程还是挺有帮助的。
C++ Primer中对左值和右值是这样描述的:
左值:是指那些求值结果为对象或函数表达式。一个表示对象的非常量左值可以作为赋值运算符的左侧运算对象。
右值:是指一种表达式,其结果是值而非值所在的位置
所以从概念中我们可以看出:左值表达式表示的是对象的身份(在内存中的位置),右值表达式表示的是对象的值。
常见的运算符中返回值的类型:
左值:赋值、下标、解引用和前置递增/递减运算符
右值:算数、关系、位、取地址以及后置递增/递减运算符
decltype运算符:解引用符生成左值,decltype(*p)的结果是个引用类型。 取地址运算符生成右值,decltype(&p)的结果是个指针。
int* p;
decltype(&p) a; // a 是 int** 类型
decltype(*p) b; // b 是 int& 类型
左值引用和右值引用(右值引用主要用于对象的移动操作):
左值持久,右值短暂(右值引用只能绑定到一个将要销毁的对象上)
左值引用只能绑定到一个左值表达式上
右值引用或const左值引用可以绑定到一个右值表达式上
int i = 5;
int &r = i; //正确,左值引用绑定到左值上
int &&rr = i; //错误,右值引用不能绑定到左值上
int &r2 = i * 5; //错误,左值引用不能绑定到右值上
const int & r3 = i * 5; //正确,const左值引用可以绑定右值
int &&rr2 = i * 5; //正确,右值引用绑定右值
关于左值和右值暂时就写这么多了,以后遇到新的内容在补充。