"&"和std :: reference_wrapper之间的区别?

Arp*_*ana 2 reference wrapper c++11

我有以下代码

#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;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用'&'运算符引用向量'r',在第二行中我注释了我使用的是C++的std :: reference_wrapper.两者都做同样的工作?但我认为即使我们有'&'来完成这项工作,也必须有一个制作std :: reference_wrapper的目的.有人可以解释一下吗?

KAB*_*ult 7

首先是两条线

std::vector<double>& r = v;
std::vector<std::reference_wrapper<double>> r(v.begin(),v.end());
Run Code Online (Sandbox Code Playgroud)

不要吝啬同样的事情.一个是对双精度矢量的引用,另一个是对双精度的"引用"的矢量.

其次,std :: reference_wrapper在泛型编程(即:模板)中很有用,其中函数可以通过复制获取其参数,但是您仍然希望通过引用传递参数.或者,如果您希望容器具有引用,但由于它们不可复制或可移动而无法使用引用,那么std :: reference_wrapper可以完成这项工作.

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

  • 通过复制部分获取参数的函数的完美示例是`std :: async`和`std :: thread` (3认同)