1. 左值和右值的区别
左值(Lvalue) 和 右值(Rvalue) 是C++中用于描述表达式类型的两个基本概念。
-
左值(Lvalue):
- 定义:表示一个有持久状态的对象,可以出现在赋值符号的左边。例如,变量、数组元素、解引用的指针等。
- 特点:可以取地址,并且可以被赋值。
-
右值(Rvalue):表示一个临时的值或一个没有持久状态的对象,通常是计算结果或字面量,可以出现在赋值符号的右边。
- 特点:不能取地址,通常不可以被赋值。
2. 左值引用和右值引用
-
左值引用(Lvalue Reference):
- 定义:使用
T&
语法,绑定到左值。可以用来修改绑定的对象。
- 定义:使用
-
右值引用(Rvalue Reference):使用
T&&
语法,绑定到右值。主要用于实现移动语义和完美转发。
3. 右值经过资源转移后是否被销毁?
右值经过资源转移(移动语义)后并不会立即被销毁。移动语义的主要目的是将资源从一个对象“移动”到另一个对象,避免不必要的复制,并提升性能。
- 移动操作:将资源(如动态分配的内存)从一个对象转移到另一个对象,同时将源对象的资源状态设置为“空”或“有效但不持有”。
- 资源转移后的状态:源对象的资源可能被设置为有效但处于不确定状态,例如,移动后的对象可能仍然是有效的,但其内部状态可能不再具有原始的语义。例如,移动构造函数和移动赋值操作符将资源的所有权转移到新对象,并通常将源对象的指针置为
nullptr
或其他安全状态。
4. 转移过后得到的值还是右值吗?它的生命周期是怎样的?
-
转移过后的值:移动后的对象一般会变成一个“有效但状态不确定”的对象,但它仍然是一个左值。移动操作不改变对象的左值或右值身份,仅仅改变了资源的所有权。
-
生命周期:转移后的对象的生命周期依然和普通对象一样。它的生命周期从创建开始,到对象销毁结束。移动语义只是改变了对象的内部状态或资源所有权。