对于ref函数的学习

起初我看到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相当于修改为深拷贝


版权声明:本文为dream0130__原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。