注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++11及BOOST特性之二十一std::function的绑定的方法的一个注意点  

2015-01-19 14:53:25|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C++11BOOST特性之二十一std::function的绑定的方法的一个注意点

 

std::function的使用过程中,发现了这样一个问题,以前没有引起过注意,现在突然出现了,还是看一下代码:

Class CB

{

    Void SetCallBack(/*const*/ std::function<void()> &fun){….}

};

 

Class Use

{

   CB cb;

   Void UseFun(){cb.SetCallBack([&](){….});}

};

 

上面的代码是编译不过去的,报得错误是“不能把参数1转换成function”,但是只要把注释部分解开就可以了。以前习惯于直接用const,因为一般使用了引用都会直接控制成常量,防止意外的修改。

其实这里原因应该也是一样的。毕竟这个function比较复杂,为了安全,要做一些预防处理,如果你使用引用,就必须使用const来控制一下。否则就没有什么问题(也就是说,如果你不使用引用,加不加const 就没有什么意义了,更深层次的原因,需要去阅读一下源代码。另外还要注意,const的常量和函数只能调用const的常量或者函数

说明:2015-04-03

1、 常函数只能调用常函数,但可以调用非常量做为右值,左值编译不通过。

2、 常量调用常量指类对象,如果把类对象常量化后,整个类对象就整体常量化了。或者换一句话,如果你传入的参数是常量,那么其内部函数操作也必须是常函数

见:http://fpcfjf.blog.163.com/blog/static/55469793201382435523216/

C++小知识44---常量const引用做参数的问题”

在处理std::function的时候儿,有时候儿会处理一些默认值,或者说要直接传进去一些数据,因为在函数的参变量的传输中,使用了&引用这个符号,所以这里就只能会用std::ref,std::cref,前者指非常量,后者指常量。而std::function的声明是无法设置默认值的,所以要直接传进去,只能用ref(假如是引用)什么的来处理了。

另外,如果你不想让对方回调时处理参数,或者说你想自己传进去几个可以自己控制的参数,比如这个Lambada表达式你有两个参数是对方控制,有两个是自己控制,那么有两个就可以不赋值让对方来赋值,有两个就得自己赋值,保证数据可控制。这个讲了很多次了,无语,真唐僧。

风起于青萍之末啊。

  评论这张
 
阅读(345)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017