
右值引用
、
移动语义和完美转发
|
193
条款
29
:假定移动操作不存在、成本高、未使用
移动语义可以说在
C++11
的所有语言特性中占据着首要中的首要地位。“移动容器现
在和复制指针一样成本低廉了!”这是你很可能听说过的,类似说法还有“复制临时
对象现在已经如此高效,如果刻意在撰写代码中避免它,就无异于犯了过早优化的禁
忌!”这些情绪化的言辞不难理解。移动语义确实是个重要的语言特性。语言不只是
允许编译器使用成本相对低廉的移动操作来代替昂贵的复制操作,实际上语言会要求
编译器这样做(只要满足适当条件就必须这样做)。调出你的
C++98
版本的代码存根,
然后只消一字不改地使用符合
C++11
标准的编译器和标准库重新编译一遍,叫一声
“变!”,你的软件便应声增速。
移动语义确有此功,所以这个语言特性一传十、十传百,渐渐成了传奇。传奇嘛,你懂的,
一般都是夸大其辞的结果。本条款就是想让你对这个语言特性的期望接上地气。
让我们从为何许多型别不能支持移动语义的观察开始。整个
C++ 98
标准库都已为
C++11
彻底翻修过,目的是为那些的型别移动的可以实现成比复制更快的型别增添移
动操作,而且库组件的实现也已完成修订以充分利用这些移动操作,不过问题在于你
有可能手上的代码存根并未完成修订以充分利用
C++11
的良好特性。若你的应用中的
(或采用的库中的)型别没有为
C++11
做过专门修改,那么仅仅在编译器中有着对移
动操作的支持也并不会给你带来什么明显好处。诚然,
C++11
愿意为这些缺少移动操
作的类生成移动操作,但这仅适用于那些未声明复制操作、移动操作以及析构函数的 ...