云计算百科
云计算领域专业知识百科平台

深入理解C++ std::forward

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;
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » 深入理解C++ std::forward
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!