← 模式
完美转发
12345678 | #include <utility> template<typename T, typename U> std::pair<T, U> make_pair_wrapper(T&& t, U&& u) { return std::make_pair(std::forward<T>(t), std::forward<U>(u)); } |
此模式采用 CC0 公共领域贡献 许可。
需要 c++11 或更新版本。
意图
将一个函数的参数转发给另一个函数,就好像被包装的函数是直接被调用的一样。
描述
完美转发允许我们保留一个参数的值类别(左值/右值)以及 const
/volatile
修饰符。完美转发分两步完成:接收一个转发引用(也称万能引用),然后使用 std::forward
将其转发。
在我们的例子中,第 4 行的参数 t
和 u
是转发引用,因为它们以 X&&
的形式声明,其中 X
是一个模板参数。我们在第 6-7 行使用 std::forward
将这些参数转发给 std::make_pair
,当原始参数是右值表达式时,这允许它们被移动到 pair 中。
完美转发经常与可变参数模板一起使用,以包装对带有任意数量参数的函数的调用。例如,std::make_unique
和 std::make_shared
都使用完美转发将其参数转发给被包装类型的构造函数。