C++ 中的 std::reference_wrapper

2025 年 5 月 19 日 | 阅读 4 分钟

通过使用类模板 std::reference_wrapper,可将类型 T 的可赋值对象或函数引用包装在可复制构造的类中。可以将 std::reference_wrapper 的实例复制或存储在容器中,但它们可以隐式转换为“T&”,因此它们可以用作接受底层类型引用的函数中的参数。

当不能直接使用原始引用时,std::reference_wrapper 函数将引用存储在容器中或作为函数参数传递。

std::reference_wrapper 经常用于基于引用的算法,其中引用必须进行多态处理,将引用传递给按值接受参数的函数,以及将引用存储在容器中。

语法

它具有以下语法:

示例 1

我们以一个示例来说明 C++ 中的 std::reference_wrapper

输出

Modified value: 40

说明

在此示例中,函数 modify 接收通过 std::reference_wrapper 传递给它的引用进行修改,这使得引用能够存储在 std::vector 中。总的来说,std::reference_wrapper 提供了一种多功能且安全的方法,可以在不适合或不切实际直接使用引用的情况下使用引用。

示例 2

我们再举一个例子来说明 C++ 中的 std::reference_wrapper

输出

Modified values:
a: 10
b: 20
c: 30

说明

  • 在此示例中,整数的引用保存在一个名为 intRefs 的向量中。
  • 我们定义了 a、b 和 c 三个整数变量。
  • 使用 std::ref 函数,这些整数的引用保存在向量中。
  • 之后,我们定义了一个名为 doubleValue 的函数,用于将引用整数的值加倍。
  • 通过迭代引用向量并将每个引用传递给 doubleValue,我们能够将每个引用整数的值加倍。
  • 最后,我们输出更新后的整数值。

示例 3

我们再举一个例子来说明 C++ 中的 std::reference_wrapper

输出

Original values: 4 7 2 9 5 
Modified values: 5 8 3 10 6 

结论

总之,当无法或不希望直接使用引用时,例如在容器中存储引用或将其传递给需要可复制元素的算法时,C++ 的 std::reference_wrapper 提供了一种有用且安全的方法来处理引用。std::reference_wrapper 函数是一个包装器,它将引用封装在一个类似对象的结构中。它允许引用进行多态处理,并用于不适合使用原始引用的情况,例如在向量或映射等标准容器中。此外,std::reference_wrapper 保留了引用语义,保证了在包装器上执行的操作会影响原始引用对象。由于其适应性和安全性,std::reference_wrapper 对于希望在各种编程场景中利用引用同时遵守特定语言结构或库接口施加的限制的程序员来说是一个有用的工具。