reference_wrapper的作用是什么?

参考:
http://en.cppreference.com/w/...
如果仅仅因为引用是不支持copy/move的,那么可以直接用指针代替啊.

比如:

     //std::vector<std::reference_wrapper<int>> v(l.begin(), l.end());
     std::vector<int *> v;
     for(auto &lnum : l) {
         v.push_back(&lnum);
     }

update20181107:
除了引用使用起来比较方便之外,在std::bind如果包装了一个入参为引用的函数, 那么为了不改变入参的属性, 就需要用std::ref(返回值就是std::reference_wrapper)来包装了:

 #include <iostream>
 #include <functional>
 
 void foo(int &a) {
     ++a;
 }
 void test_func(std::function<void(void)> fun) {
     fun();
 }
 int main()
 {
     int a = 1;  
     std::cout<<"a="<<a<<"\n";
     // 用std::bind绑定参数a, 这个时候传值, 函数的调用已经和外层没有什么关系了.
     test_func(std::bind(foo, a));
     std::cout<<"a="<<a<<"\n";
 
     // a 仍然保留引用的属性, ++a
     test_func(std::bind(foo, std::ref(a)));
     std::cout<<"a="<<a<<"\n";
     // lambda表达式把要包装的函数 foo 显式化,a传入直接就是引用. ++a
     test_func([&](){foo(a);});
     std::cout<<"a="<<a<<"\n";
 }
阅读 6.4k
2 个回答

可以阿,reference_wrapper也只是提供一个使用上可能性而已,毕竟按理说c++中所有使用
引用的地方不都是可以使用指针替代么?

除了引用使用起来比较方便之外,在std::bind如果包装了一个入参为引用的函数, 那么为了不改变入参的属性, 就需要用std::ref(返回值就是std::reference_wrapper)来包装了:

 #include <iostream>
 #include <functional>
 using namespace std;
 using namespace std::placeholders;
 
 void foo(int &a) {
     ++a;
 }
 void test_func(std::function<void(void)> fun) {
     fun();
 }
 
 void print(ostream &os, int i) {
     os<<i<<std::endl;
 }
 int main()
 {
     int a = 1;  
     std::cout<<"a="<<a<<"\n";
     test_func(std::bind(foo, a));
     std::cout<<"a="<<a<<"\n";
 
     // a 仍然保留引用的属性
     //test_func(std::bind(foo, std::ref(a)));
     test_func(std::bind(foo, std::reference_wrapper<int>(a)));
     std::cout<<"a="<<a<<"\n";
     test_func([&](){foo(a);});
     std::cout<<"a="<<a<<"\n";
 
     // 这里std::ref的作用就是防止编译报错了,因为`ostream`对象本身就是不允许拷贝的,也就是放在std::bind里面会编译失败
     std::function<void(int)> pt = 
         std::bind(print, std::ref(std::cout), _1);
     pt(1);
 }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题