cpp完美转发与引用折叠
内容简介
完美转发用于在模板函数中把参数继续传给另一个函数,同时保留参数原来的左值/右值属性。它依赖转发引用、引用折叠和 std::forward。
日常开发中不需要频繁手写完美转发,但理解它有助于看懂 make_unique、emplace_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是按模板推导结果有条件转发。- 普通业务代码优先写清楚接口,只有泛型封装才常需要完美转发。