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

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++11及BOOST特性之十四对lambda表达式和delete关键字的一些补充认识  

2014-06-16 10:44:46|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C++11BOOST特性之十四对lambda表达式和delete关键字的一些补充认识

 

在讨论单实例的过程中,涉及到构造函数的私有化时想到了在C++11中提供了delete这个关键字,那么在编译环境下,私有化和delete会提供什么样的错误信息呢?

在非C++11中,会报一个无法访问私有成员函数,而在C++11中会报一个“尝试引用已删除的函数”。

这也从一个侧面说明,在C++11中对构造函数或想到删除的函数,直接使用delete关键字更安全,更稳妥,其对是否要求为private上更为宽泛。防止出现写错关键字而产生的隐含BUG。这样,才能提供更健壮的代码。

另外顺便再说一下前面提到过得大括号初始化的问题,看下面的代码:

//测试大括号及=delete

class TestDelete

{

public:

         TestDelete() = delete;

         //TestDelete(){}

         TestDelete(int a,int b,int c){}

         ~TestDelete(){}

public:

         int c;

         void MyTest(){}

private:

         int a;

         void Test(){}

         int b;

};

应用上这么使用:

TestDelete td{0,1,2};

这里需要说明的是,这和C的结构体里赋值还是有区别,或者说必须得有相应的构造函数才行。举上面的例子,如果没有第二个构造函数,仍然会报错。所以说前面的理解还是有些偏差的,这就是所谓的实践出真知。

最后再说一下lambda表达式中的一些参数捕捉的问题,看下面的例子:

         bool bRet = true;

         try

         {

//std::thread temp = std::thread([&,bRet]( int& count, std::string s)mutable throw()->bool{               

std::thread temp = std::thread([=]( int& count, std::string s)mutable throw()->bool{

                            numtemp = 2;

                            s = "";

                            count = 9;

                            bRet = true;

                            ttd.MyTest();

                           

                            return bRet;

 

                   }, std::ref(numtemp), "start thread");

 

                   temp.detach();

         }

         catch (...)

         {

                   bRet = false;

         }

 

在所有的帮助文档中,都有一句类似的话,lambda表达式默认的捕获参数是const方式,mutable关键字的作用是可以改变复制的值并且可以访问non-static。但一直在实践中使用[&]或者[=],所以一直也没有遇到这种问题,直到后来发现上面注释的方法,如果使用bRet,给他赋值就会出现编译错误(智能提示都会出现错误,当然,一些IDE是没有的)。这才验证了上面提到的lambda表达式默认是const不可改变的。也就是在使用的过程中出现关键字mutable的原因。

很多的细节看来还需要继续努力深入的学习。

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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