多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 一.值的分类 ### 传统分类 1. **左值 lvalue (位置值)** 存储数据值的内存位置。可以取地址。 2. **右值 rvalue (被读取的值)** 它的数据值,存储在某个内存地址中。不可取地址。 注: 1. VC++6.0中, **匿名类类型对象** 为左值。 ### \[11+\][$]新标准分类 + **拥有身份** 可以确定表达式与另一表达式是否有相同的内存位置,或相对内存位置。 >例如 表达式 `5;` 和另一处的表达式 `5;` 是否是相同的内存位置是不确定的。因为表达式结束后,它的生命期就结束了。下一次它被分配在什么内存位置也不确定,也许是上次分配的位置,也许是另外的位置。 >例如 对于一个局部变量(没有重名的其他域的变量),可以确定其内存位置。 + **可被移动** 可以被用作移动构造函数、移动赋值运算符等的参数。 | 类别|作用域(相对)| 拥有身份| 可取地址| 可移动| 案例| |----|----|----|----|----|----| | `lvalue` 左值|长| √ | √ | × | 变量名,字符串常量,具名右值引用,左值引用 | | `xvalue` 将亡值|短| √ | × | √ | 匿名右值引用 | | `prvalue` 纯右值|短| × | × | √ | 字面值常量(除了字符串常量),匿名对象 | | 类别|子类别| 拥有身份| 可取地址| 可移动| 案例| |----|----|----|----|----|----| | `glvalue` 泛左值|将亡值,左值| √ | ? | ? | 变量名,右值引用,左值引用| | `rvalue` 右值|将亡值,纯右值| ? | × | √ |字面值常量(除了字符串常量),匿名对象,匿名右值引用 | ![](https://img.kancloud.cn/93/b4/93b4ab320e87ea66e3a73779a008bc94_458x230.png) ## [$]二.具名对象、匿名对象与左右值 |类型|具名对象|匿名对象| |----|----|----| |非引用类型|左值|右值(新标准为纯右值,但是匿名的字符串是左值)| |左值引用|左值|左值| |右值引用|左值|将亡值| 注: 1. VC++6.0中,匿名类类型对象为左值。 ## \[11+\][$]三.std::move(exp) 1. **用途** 强行将左值转换为右值引用,这样创建一个新对象的时候,可以调用移动构造函数,而不是拷贝构造函数,减小内存开销。 2. **注意** 这意味着除了对原左值赋值或销毁,程序员不再使用它。