C++ 深入理解右值引用与移动语义
一、值类别
1.1 值类别是什么
在 C++ 中,表达式是由一个或多个操作数(operands)和零个或多个运算符(operators)组成的语法单元,每个表达式都会生成一个值,每个值有两种属性:类型与值类别。类型有int、double等内置类型,也有用户自定义类型。值类别是指按是否可标识与是否可移动两个独立属性对值进行分类。 C++ 语言及其工具和规则的许多方面都需要正确理解这些值类别以及对它们的引用。 这些方面包括获取值的地址、复制值、移动值、将值转发给另一函数。
1.2 C++ 98/03
C++ 98/03依据是否可标识将值类别分为左值与右值两种。这里的左与右是指是否可出现在赋值运算符的左边与右边。但这只是最简单字面意思,实际区分左值与右值是通过是否可标识。
左值(lvalue):一个指向特定内存的具有标识的值(具名对象),它有一个相对稳定的内存地址,并有较长生命周期。命名的变量或常量,返回左值引用的函数都是左值。
1 | int global_var = 2025; // 左值 |