std::ref std::cref

1. points

cref 是const ref的意思,常量引用。

  

先看一个使用例子

上面的例子中,如果没有使用ref,而是下面的形式

std::function<void()> bound_f = std::bind(f, n1, n2, n3);
bind()是一个函数模板,简单来说它可以根据一个已有的函数,生成另一个函数,但是由于bind()不知道生成的函数执行的时候传递的参数是否还有效,所以它选择按值传参而不是按引用传参即使f的定义里使用的是引用形式的入参,f也不会改变n2的值。因为

 

但是如果f的定义声明里不是引用形式的入参,而是下面的形式,也改变不了n2的值,因为

void f(int& n1, int n2, const int& n3);

ref()是利用模板参数推导实现的,如果你创建一个按值传参的非模板函数而想传递一个引用,ref()是做不到的。

  

所以有些地方使用需要通过ref来传递引用。如使用bind时,或者thread,详细情况参考下面的网址。

 

 

参考:

浅析std::ref与reference_wrapper

http://blog.csdn.net/u014645632/article/details/78966340

为什么C++11引入了std::ref?

https://www.cnblogs.com/jiayayao/p/6527713.html

关于C++ 11中std::ref的用法

http://blog.sina.com.cn/s/blog_7c4f3b160101e8yt.html

cppreference.com

http://zh.cppreference.com/w/cpp/utility/functional/ref

 

 

2. 为什么要有std::ref

除了要在上面一些场合使用std::ref来传递引用,std::ref(T) 与T&的还有一些区别:

a)      因为T&一旦创建,便不能修改

b)      不能创建T&数组

而上述两点std::ref(T)都能克服。

 

 

参考

C++ Difference between std::ref(T) andT&?

https://stackoverflow.com/questions/33240993/c-difference-between-stdreft-and-t/33243776#33243776?newreg=5672c9cf361c43ec87abd84889b9af0f

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值