目的

  1. 实现移动语义(Move Sementics),减少不必要的临时对象的创建、拷贝、销毁(内存管理费时),极大地提升语言效率

  2. 完美转发(Perfect Forwarding),可以简洁地定义泛型函数

要点

  • 右值引用除了拥有左值引用的功能,还可以绑定到临时对象(rvalue),而(non const)左值引用不可以!

    1
    2
    A&  a_ref3 = A();  // Error!
    A&& a_ref4 = A(); // Ok
  • 右值引用类型既可以被当作左值也可以被当作右值,判断的标准是,如果它有名字,那就是左值,否则就是右值。

    为了确保move之后,不会被再次引用到。所以,有名字的变量是左值。

  • std::move可以将一个有名变量(左值)转换为右值引用

    该功能的意图是,该变量作为其他变量的值来源后,便不再使用该值,只用来被赋值或弃用。

    典型用途:

    1
    2
    3
    4
    5
    6
    7
    template<class T>
    void swap(T& a, T& b)
    {
    T tmp(std::move(a)); // a用来作为tmp的值来源
    a = std::move(b); // a被重新赋值
    b = std::move(tmp); // tmp不再使用
    }

    :若该类型不支持移动操作,则仍执行对应的拷贝或赋值操作。

参考

  1. http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/
  2. A Brief Introduction to Rvalue References

留言