起初我看到ref这个函数是十分疑惑的,为什么c++本身已经有引用,还要引入一个std::ref?
主要是考虑到函数式编程(bind(),aysnc())在使用的时候,直接对参数进行拷贝
std::ref只是尝试模拟引用传递,并不能真正变成引用,在非模板情况下,std::ref根本没法实现引用传递,只有模板自动推导类型时,ref能用包装类型reference_wrapper来代替原本会被识别的值类型,而reference_wrapper能隐式转换为被引用的值的引用类型。
比如thread的方法传递引用的时候,必须外层用ref来进行引用传递,否则就是浅拷贝。
#include< iostream>
#include< string>
#include< functional>
using namespace std;
void test(int &i , double d,const string &s)
{
cout << "i = " << i << "d = " << d << " s = " << s << endl;
i++;
}
int main ()
{
function<void(void) > fp;
string s = "f";
int a = 3;
double b = 2.3;
fp = bind(&test,ref(a),b,s); // ref 可以在模板传递参数的时候传递引用,不然无法传递,相当于一次引用,会修改当前的值
fp = bind(&test,a,b,s); // ref 可以在模板传递参数的时候传递引用,不然无法传递,相当于一次引用,会修改当前的值
fp();
cout << a << endl;
return 0;
}
在有ref的情况下 a被修改为4 ,没有的话,a还是3,使用ref相当于修改为深拷贝