05 Rvalue References, Move Semantics, and Perfect Forwarding

当初次学习移动语义(move semantics)和完美转发(perfect forwarding)时,它们相当直观: * 移动语义:使用相对廉价的移动操作替代昂贵的复制操作。实现移动构造函数和移动赋值操作控制其行为。移动语义允许只能移动(move-only)的类型,比如 std::unique_ptr std::future std::thread。 * 完美转发:使得我们可以实现一个模板函数,接受任意多的参数,将其转发给其他函数,传递给目标函数和传递给转发函数的参数一致。

右值引用(rvalue references)是结合这两个毫不相关的功能的粘合剂。它也是语言底层机制,使移动语义和完美转发变得可能。

随着使用的深入,最初的印象只不过是冰山一角。std::move 并不移动任何东西;完美转发可能不完美;移动操作可能不比复制更轻,即使是移动,也没有预期的这么轻;即使存在也并不总是被调用;type&& 也并不总是表示右值引用。

这一章将会讲解最基础的部分,一旦掌握了这些,一切又能回到直观的状态了。

阅读这一章的各个小节时,牢记参数永远是左值,即使它的类型是右值引用。比如

void f(Widget&& w);
中的 w 是左值,其类型是右值引用。