我们知道,C++ 里有左值和右值。但是标准里的定义实际更复杂,规定了下面这些值类别(value categories): 它们的释义如下:
- lvalue: 左值,是通常可以放在等号左边的表达式
- rvalue:右值,是通常只能放在等号右边的表达式
- glvalue:generalized lvalue,广义左值
- xvalue: expiring lvalue,将亡值
- prvalue:pure rvalue,纯右值
我们暂且抛开这些概念,只看其中两个:lvalue 和 prvalue。 左值 lvalue 是有标识符、可以取地址的表达式,最常见的情况有: - 变量、函数或数据成员的名字
- 返回左值引用的表达式,如 :++x、x = 1、cout << ’ ’
- 字符串字面量如 “hello world”
在函数调用时,左值可以绑定到左值引用的参数,如 T&。一个常量只能绑定到常左值引用,如 const T&。 反之,纯右值 prvalue 是没有标识符、不可以取地址的表达式,一般也称之为“临时对象”。最常见的情况有:
- 字面值(字符串字面值除外),例如1,‘a’, true等
- 返回值为非引用的函数调用或操作符重载,例如:str.substr(1, 2), str1 + str2, or it++
- 后置自增和自减表达式(a++, a–)
- 算术表达式
- 逻辑表达式
- 比较表达式
- 取地址表达式
- lambda表达式
例如:
nullptr; true; 1; a > b; a && b; int fun(); fun(); int a = 1 + 1; int b = 2; a + b; a++; b–;
参考: https://www.zhihu.com/question/23520802
|