std::forward 是 C++11 引入的一个工具,位于 <utility> 头文件中。它的核心作用是完美转发(perfect forwarding)——在函数模板中,将参数以原始的左值/右值属性(即“值类别”)传递给另一个函数,既不额外拷贝,也不改变其 const/volatile 修饰。简单说,就是“保持参数的原样”。
它的典型使用场景是:编写一个包装函数(wrapper),它接收参数后要原封不动地转交给另一个函数(如构造函数、工厂函数等),同时保证移动语义仍能生效。
工作原理简述
-
std::forward 通常与万能引用(universal reference)配合使用,即模板参数为 T&& 的形式。
-
当传入左值时,T 被推导为左值引用类型(如 int&),std::forward<T>(arg) 返回左值引用。
-
当传入右值时,T 被推导为非引用类型(如 int),std::forward<T>(arg) 返回右值引用。
-
引用折叠规则保证了返回值的正确性。
#include <iostream>
#include <utility> // std::forward
#include <string>
// 两个重载函数,用于区分左值和右值
void process(int& x) {
std::cout << "process(int&): 左值引用, 值为 " << x << std::endl;
}
void process(int&& x) {
std::cout << "process(int&&): 右值引用, 值为 " << x << std::endl;
}
// 万能引用的包装器,使用 std::forward 完美转发
template<typename T>
void wrapper(T&& arg) {
// 将 arg 以原始值类别转发给 process
process(std::forward<T>(arg));
}
int main() {
int a = 42;
// 传入左值 a -> wrapper 接收左值,forward 后 process 调用左值重载
wrapper(a);
// 传入右值 100 -> wrapper 接收右值,forward 后 process 调用右值重载
wrapper(100);
// 也可以使用 std::move 将左值转为右值传入
wrapper(std::move(a)); // 此时 a 被转为右值,调用右值重载
return 0;
}
网硕互联帮助中心



评论前必须登录!
注册