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&&
也并不总是表示右值引用。
这一章将会讲解最基础的部分,一旦掌握了这些,一切又能回到直观的状态了。
阅读这一章的各个小节时,牢记参数永远是左值,即使它的类型是右值引用。比如
中的w
是左值,其类型是右值引用。