std::forward的核心作用是在模板函数中将参数按原始值类别(左值或右值)完美转发给另一函数,必须配合万能引用T&&使用且需显式指定模板参数,典型用于构造函数和工厂函数实现移动/拷贝的自动选择。
std::forward 的核心作用是:在模板函数中,把参数以它原本的值类别(左值或右值)原样转发给另一个函数。它本身不移动、不拷贝,只做“类型转换标记”,配合万能引用(T&&)才能生效。
std::forward 只有在参数声明为 T&&(且 T 是模板参数)时才有意义。这种写法实际是“万能引用”,能匹配左值和右值,并通过引用折叠保留原始值类别。
std::forward
std::forward(arg) (T 是模板参数类型)std::forward(arg)(不合法,缺少模板实参)std::forward(arg) (decltype(arg) 总是 T&,永远转成左值)最常见的是实现完美转发的构造函数或 make 函数,比如模拟 std::make_unique:
templateauto make_unique(Args&&... args) { return std::unique_ptr (new T(std::forward(args)...)); }
这里每个 std::forward(args) 都会把对应实参按它本来是左值还是右值的方式传给 T 的构造函数——左值调用拷贝构造,右值调用移动构造,不产生多余拷贝。
std::forward 不改变变量本身,但它常用于触发移动语义。
一旦你用 std::forward 转发了一个右值,后续再访问 x 就是未定义行为(如果 T 是非引用类型,x 实际上被 move 走了)。
基本上就这些。std::forward 不复杂,但容易忽略它依赖万能引用和显式模板实参这两个前提。