Logo
Section 1 / 11

右值和左值

在这里,我们将讨论右值、左值及其引用的特性。

导入

右值和左值

在这里,我们将讨论右值、左值及其引用的特性。

右值与左值

右值(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());

右值绑定到右值引用具有更高的优先级。

右值引用的应用

移动语义

  • 用廉价的移动代替昂贵的拷贝。
  • 无需内存分配和释放。
  • 不可拷贝但可移动的对象可以通过值传递转移。

完美转发

  • 在不改变对象原本是右值还是左值性质的前提下进行转发。这在函数模板中非常有用。

在下一课中,我们将学习右值引用的一个实际示例。

const、constexpr 和 volatile

- 示例