导入
右值和左值
在这里,我们将讨论右值、左值及其引用的特性。
右值与左值
右值(Rvalues)是:
- 临时对象。
- 没有名字的对象。
- 无法获取其地址的对象。
- 始终出现在赋值操作的右侧。
其余的都是左值(Lvalues)。它们可以出现在赋值操作的任意一侧。
左值可以出现在赋值操作的左侧(当然也可以在右侧)。
常量左值或右值不能出现在赋值操作的左侧,只能出现在右侧。
1int lValue = 1998; // 1998 是一个右值 2lValue = 2011; 3const int lValue2 = 2011; 4lValue2 = 2011; // 错误 5 6int defInt = int{}; 7int res = 2000 + 11; 8auto func = []{std::cout << "2011" << std::endl;};
左值引用与右值引用
- 左值引用使用一个
&符号声明。 - 右值引用使用两个
&&符号声明。
左值只能绑定到左值引用。而右值可以绑定到右值引用,或者常量左值引用。
1MyData myData; 2MyData& lvalueRef(myData); 3MyData&& rvalueRef(MyData()); 4const MyData& constLValueRef(MyData());
右值绑定到右值引用具有更高的优先级。
右值引用的应用
移动语义
- 用廉价的移动代替昂贵的拷贝。
- 无需内存分配和释放。
- 不可拷贝但可移动的对象可以通过值传递转移。
完美转发
- 在不改变对象原本是右值还是左值性质的前提下进行转发。这在函数模板中非常有用。
在下一课中,我们将学习右值引用的一个实际示例。