
右值引用
、
移动语义和完美转发
|
203
to-const
)。在按值传递的形参这种情况下,被调用的函数显然收到是位域内的值的副本;
而在常量引用形形参这种情况下,标准要求这时引用实际绑定到存储在某种标准整型
(例如
int
)中的位域值的副本。常量引用不可能绑定到位域,它们绑定到的是“常规”
对象,其中复制了位域的值。
这么一来,把位域传递给完美转发函数的关键,就是利用转发目的函数接收的总是位
域值的副本这一事实。你可以自己制作一个副本,并以该副本调用转发函数。例如,
在
IPv4Header
一例中,下述代码即演示了该技巧:
//
复制位域值,初始化形式参见
条款
6
auto length = static_cast<std::uint16_t>(h.totalLength);
fwd(length);
//
转发该副本
结语
在绝大多数情形下,完美转发就如规定所言的方式运作如仪。你很少需要特别留意什
么。但当它无法运作时,亦即,当一些看上去合理的代码编译失败,或者更讨厌的情况,
可以通过编译,行为却表现得和预料不同,重要的是要了解完美转发的不完美之所在,
同样重要的是知道如何规避它们。在绝大多数情形下,这些规避手法都是直截了当的。
要点速记
•
完美转发的失败情形,是源于模板型别推导失败,或推导结果是错误的型别。
•
会导致完美转发失败的实参种类有大括号初始化物、以值
0
或
NULL
表达的
空指针、仅有声明的整型
static const
成员变量、模板或重载的函数名字,
以及位域。