2. 左值和右值
左值 是指可以放置在赋值运算符左侧的值,右值是只能放在赋值运算符右侧的值。左值和右值是表达式(非变量)的基本属性。
左值 是具有内存地址的表达式,它存在于内存中,可以用取地址运算符(&)来获取内存地址。如:变量、数组、指针解引用等。如:
int x = 100; // x 是左值
int *px;
px = &x; // px 是左值
右值 是不具有内存地址的表达式,它是临时的、即将销毁的值,它没有持久的内存地址,不能用取地址运算符(&)来获取内存地址。如:字面值(88),算数表达式的返回值(a+b)、函数返回的临时对象等。如:
int x = 100; // 100 是右值(字面值)
int y = x + 1; // x+1 返回的值(对象)是右值(临时值)
现代 C++(C++11 起)的进一步把右值分成了两类(为了更好的优化程序):
- 纯右值:就是传统的右值,比如
100、true、x + y、返回的临时对象的函数调用。 - 将亡值:即将被移动的资源。比如
std::move(a)的返回值(后面才讲),它像个右值,但实质是绑定一个即将被窃取资源的左值。
为什么要区分左值和右值?
区分左值和右值是为了优化程序的需要,区分左值和右值可以有效的根据左值和右值调用不同的重载函数,避免不必要的深拷贝(窃取将亡值的资源),以提升程序运行的性能。