
196
|
第
5
章
然而,通常你已知代码中会使用的型别,也可以肯定它们的特性不会改变(例如,它
们是否支持成本低廉的移动操作)。如果是这样的情形,你就不需要前面那些假定。
你可以直接查阅所使用的型别对移动的支持细节。如果涉及的型别能够提供成本低廉
的移动操作,并且是在这些移动操作会被调用的语境中使用对象,则可以放心大胆地
依靠移动语义来将复制操作替换成相对不那么昂贵的对应移动操作。
要点速记
•
假定移动操作不存在、成本高、未使用。
•
对于那些型别或对于移动语义的支持情况已知的代码,则无需作以上假定。
条款
30
:熟悉完美转发的失败情形
在
C++11
的宝箱上最引人注目的语言特性纹章之一,就是完美转发。完美转发,可是
完美的哟!不过,揭开宝箱的表面,你才会发现会有这样的“完美”(理想版)和那
样的“完美”(现实版)。
C++11
的完美转发相当不错,但如果一定要说达到了真正
的完美之境,那就不能拘泥于若干“小节”。该条款就致力让你熟悉这些“小节”。
在我们的“小节”探险启程之前,还是值得反思一下“完美转发”的确切含义。“转发”
的含义不过是一个函数把自己的形参传递(转发)给另一个函数而已。其目的是为了
让第二个函数(转发目的函数)接受第一个函数(转发发起函数)所接受的同一对象。
这就排除了按值传递形参,因为它们只是原始调用者所传递之物的副本。我们想要转
发目的函数能够处理原始传入对象。指针形参也只能出局,因为我们不想强迫调用者
传递指针。论及一般意义上的转发时,都是在处理形参为引用型别的情形。
完美转发的含义是我们不仅转发对象,还转发其显著特征:型别 ...