右值引用、移动语义、完美转发

移动语义使编译器可以用移动操作来替换花销较大的复制操作。与拷贝构造函数和拷贝赋值运算符类似,开发者可以自由定制移动操作的一切行为。移动语义还允许创建move-only类型,例如std::unique_ptr,std::future和std::thread。

完美转发使得编写形参为任意参数的函数模板成为可能,并且能够在转发参数时确保接收函数与发送函数保持一致。

Rvalue引用是将这两个不同的特性联系在一起的粘合,它是使移动语义和完美转发成为可能的底层语言机制。

对这些功能的体验越多,开发者就越意识到这些功能妙用无穷。移动语义,完美转发和右值引用的世界比它们展示出来的更加微妙。举例而言,std::move不移动任何东西,完美转发并不完美。移动操作并不总是拷贝制开销更低; tyep&& 也并不总是代表右值引用等等。

在本章需要明确的是,参数必然是一个左值,即使它被声明为一个右值形式:

1
void f(Widget&& w);

即w是一个左值,即使其类型为rvalue-reference-to-Widget。