“&”之间的区别和std :: reference_wrapper?

时间:2015-07-07 14:04:00

标签: c++11 reference wrapper

我有以下代码

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

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

1 个答案:

答案 0 :(得分:7)

首先,两行

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

不要吝啬同样的意思。一个是对双向量的引用,另一个是&#34;向量&#34;的向量。加倍。

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

基本上,std :: reference_wrapper就像&#34;&amp;&#34;参考,但它是可复制和可重新分配的