前言:
std::forward
是 C++ 完美转发(Perfect Forwarding)的核心工具,它与万能引用配合使用,保持参数原始的值类别(左值/右值)。
一、使用 std::forward 实现完美转发
1、源码实现
// 简化后的典型实现
template<typename T>
constexpr T&& forward(typename std::remove_reference<T>::type& t) noexcept {
return static_cast<T&&>(t);
}
template<typename T>
constexpr T&& forward(typename std::remove_reference<T>::type&& t) noexcept {
static_assert(!std::is_lvalue_reference<T>::value,
"Cannot forward an rvalue as an lvalue");
return static_cast<T&&>(t);
}
2、工作原理
- 类型推导:
- 当
T
是左值引用(如int&
),T&&
折叠为int&
(引用折叠规则) - 当
T
是非引用(如int
),T&&
保持为int&&
- 当
- 转发过程:
template<typename T> void wrapper(T&& arg) { // 保持 arg 的原始值类别 process(std::forward<T>(arg)); }
- 如果传入左值:
T
推导为X&
→forward
返回X&
- 如果传入右值:
T
推导为X
→forward
返回X&&
- 如果传入左值:
- 与
std::move
的区别:std::move
无条件转为右值std::forward
有条件地保持值类别
3、典型使用场景
template<class T>
void logAndProcess(T&& param) {
logTime();
// 完美转发 param 到 process
process(std::forward<T>(param));
}
// 调用示例
Widget w;
logAndProcess(w); // 左值调用
logAndProcess(Widget()); // 右值调用
注意:
std::forward
本质上是一个有条件的static_cast
,它根据模板参数T
的类型决定是否保留右值属性。