“&”和std::reference_wrapper的区别?
Difference between "&" and std::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;
}
我正在使用“&”运算符引用向量 'r',在我注释掉的第二行中,我正在使用 C++ 的 std::reference_wrapper。两者的工作几乎相同?但我认为即使我们有'&'来完成这项工作,也必须有一个制作std::reference_wrapper的目的。谁能解释一下?
首先是两条线
std::vector<double>& r = v;
std::vector<std::reference_wrapper<double>> r(v.begin(),v.end());
意思不一样。一个是对双打向量的引用,另一个是 "references" 对双打的向量。
其次,std::reference_wrapper 在泛型编程(即模板)中很有用,在泛型编程中,任一函数可能通过复制获取其参数,但您仍希望通过引用传递参数。或者,如果您希望容器具有引用,但不能使用引用,因为它们不可复制或移动,那么 std::reference_wrapper 可以完成这项工作。
本质上,std::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;
}
我正在使用“&”运算符引用向量 'r',在我注释掉的第二行中,我正在使用 C++ 的 std::reference_wrapper。两者的工作几乎相同?但我认为即使我们有'&'来完成这项工作,也必须有一个制作std::reference_wrapper的目的。谁能解释一下?
首先是两条线
std::vector<double>& r = v;
std::vector<std::reference_wrapper<double>> r(v.begin(),v.end());
意思不一样。一个是对双打向量的引用,另一个是 "references" 对双打的向量。
其次,std::reference_wrapper 在泛型编程(即模板)中很有用,在泛型编程中,任一函数可能通过复制获取其参数,但您仍希望通过引用传递参数。或者,如果您希望容器具有引用,但不能使用引用,因为它们不可复制或移动,那么 std::reference_wrapper 可以完成这项工作。
本质上,std::reference_wrapper 就像一个“&”引用,除了它是可复制和可重新分配的