前言:
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的类型决定是否保留右值属性。
9120

被折叠的 条评论
为什么被折叠?



