← 模式

完美转发

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 行的参数 tu 是转发引用,因为它们以 X&& 的形式声明,其中 X 是一个模板参数。我们在第 6-7 行使用 std::forward 将这些参数转发给 std::make_pair,当原始参数是右值表达式时,这允许它们被移动到 pair 中。

完美转发经常与可变参数模板一起使用,以包装对带有任意数量参数的函数的调用。例如,std::make_uniquestd::make_shared 都使用完美转发将其参数转发给被包装类型的构造函数。

贡献者

  • Joseph Mansfield
  • Max Galkin

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享