【问题标题】:Difference between "&" and std::reference_wrapper?“&”和 std::reference_wrapper 的区别?
【发布时间】:2015-07-07 14:04:00
【问题描述】:

我有以下代码

#include <iostream>
#include <vector>
#include <functional>

int main() {
    std::vector<double> v(5, 10.3);
    std::vector<double>& r = v;
    //std::vector<std::reference_wrapper<double>> r(v.begin(),v.end());
    for (auto& i : v)
        i *= 3;
    for (auto i : r)
       std::cout << i << " ";
    std::cout << std::endl;
}

我正在使用“&”运算符对向量“r”的引用,在我注释掉的第二行中,我正在使用 C++ 的 std::reference_wrapper。两者都做几乎相同的工作?但我认为制作 std::reference_wrapper 必须有一个目的,即使我们有 '&' 来完成这项工作。谁能解释一下?

【问题讨论】:

  • r.resize(200),你会看到不同之处——一个指的是向量,其他指的是doubles。
  • &amp; 这里不是运算符。

标签: c++11 reference wrapper


【解决方案1】:

首先是两行

std::vector<double>& r = v;
std::vector<std::reference_wrapper<double>> r(v.begin(),v.end());

不是同一个意思。一个是对双精度向量的引用,另一个是对双精度的“引用”向量。

其次,std::reference_wrapper 在泛型编程(即:模板)中很有用,其中一个函数可能通过复制获取其参数,但您仍希望通过引用传入参数。或者,如果您希望容器具有引用,但不能使用引用,因为它们不可复制或不可移动,那么 std::reference_wrapper 可以完成这项工作。

从本质上讲,std::reference_wrapper 就像一个“&”引用,除了它是可复制和可重新分配的

【讨论】:

  • 通过复制部分接受参数的函数的完美示例是std::asyncstd::thread
猜你喜欢
  • 2015-01-02
  • 2017-07-31
  • 1970-01-01
  • 2020-02-09
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
相关资源
最近更新 更多