右移

—— 资源的转移而避免拷贝。

在 C++ 中,右值(rvalue) 是指在表达式中 无法取得持久引用 的值,通常是临时对象或常量,生命周期较短,往往在表达式结束时就会被销毁。右值是相对于**左值(lvalue)**而言的,左值是指可以被持久引用的对象(如变量)。

右值的具体内容可以包含:

  1. 字面量(如整数、浮点数等):

    • 比如 423.14 是右值,它们没有在内存中的固定位置,是编译器在需要时生成的临时值。

    • 示例:

      int a = 42;  // 42 是右值
  2. 临时对象

    • 某些表达式的结果是一个临时对象,通常这些对象会在表达式结束后立即被销毁,因此也被认为是右值。

    • 比如:

      std::string("hello")  // 这个临时字符串对象是右值
  3. 函数返回的非引用类型的值

    • 当一个函数返回值不是引用类型时,它的返回值就是一个右值,因为它通常是一个临时的对象,在返回后不久就会被销毁。

    • 示例:

      std::string getString() {
          return "temporary";
      }
      auto str = getString();  // getString() 返回的临时字符串是右值
  4. 表达式计算的临时结果

    • 许多操作符的计算结果是右值,例如算术运算符、逻辑运算符等的结果。

    • 示例:

      int b = 1 + 2;  // 1 + 2 的结果 3 是一个右值

左值与右值的区别:

  • 左值(lvalue):可以取地址的值,可以赋值给左值。它通常表示有名字的、持久存在的内存对象,例如变量或数组元素。左值可以在表达式中出现在赋值操作符的左侧。

    • 示例:

      int x = 10;   // x 是左值
  • 右值(rvalue):无法取地址的临时值,它通常是表达式计算出来的中间结果或临时对象,不能在赋值操作符的左侧。

    • 示例:

      int y = 5 + 3;  // 5 + 3 的结果 8 是右值

左值与右值的常见场景:

  • 在普通赋值语句中,左值出现在赋值符号的左边,而右值则出现在右边:

    int x = 10;  // x 是左值,10 是右值
  • C++11 引入了右值引用T&&),用来处理右值,从而实现移动语义,大幅优化了对临时对象的处理效率,避免了不必要的拷贝。

小结:

  • 右值 是临时、短期存在的值,无法被引用,通常是字面量、函数返回的非引用值、表达式的中间结果等。

  • 通过 C++11 的右值引用特性,右值可以用于实现高效的移动操作,优化程序性能。

Last updated