C++11引入了右值引用,用来支持移动语义和完美转发。
- 移动语义:传统的复制操作需要额外的时间和空间,而有了移动语义后,可以直接将资源(如内存)从一个对象转移到另一个对象,而不必创建并删除临时对象。这对于大对象或者拥有独占所有权资源的对象特别有用。例如,unique_ptr和std::vector等STL容器就利用了移动语义实现了高效的操作。
- 完美转发:在函数模板中,我们想把参数原封不动地传递给其他函数。由于传参可能存在值传递、左值引用、常量左值引用、右值引用等情况,为了保证参数的属性和类型不发生变化,我们需要使用std::forward实现完美转发。
右值引用主要用于两种场景:一是对象的移动(Move),二是万能引用(Forwarding Reference)。对于第一种情况,它是为了解决对象的复制效率问题;对于第二种情况,则是为了实现参数的完美传递,避免不必要的拷贝。