cpp完美转发与引用折叠

内容简介

完美转发用于在模板函数中把参数继续传给另一个函数,同时保留参数原来的左值/右值属性。它依赖转发引用、引用折叠和 std::forward

日常开发中不需要频繁手写完美转发,但理解它有助于看懂 make_uniqueemplace_back、通用工厂函数和泛型库。

核心规则

template <typename T>
void wrapper(T&& value)
{
    target(std::forward<T>(value));
}

这里的 T&& 在模板参数推导中不是普通右值引用,而是转发引用。

引用折叠

组合折叠结果
T& &T&
T& &&T&
T&& &T&
T&& &&T&&

只要出现左值引用,结果就是左值引用。

易错点

template <typename T>
void wrapper(T&& value)
{
    target(value);  // value 有名字,所以它是左值
}

即使调用者传入右值,value 本身也是左值。要保持原始值类别,需要 std::forward<T>(value)

注意事项

  • std::move 是无条件转右值。
  • std::forward 是按模板推导结果有条件转发。
  • 普通业务代码优先写清楚接口,只有泛型封装才常需要完美转发。

相关:完美转发右值引用cpp值类别cpp可变参数模板