lambda表达式中的方括号成为捕捉块,能够在这里指定怎样从所在的作用域中捕捉变量.

捕捉的意思是指能够在该lambda中使用该变量.即能够捕获外部变量在lambda表达式内使用.

能够使用两种方式来捕捉所在的作用域中的全部变量.

[=]:通过值捕捉全部变量

[&]:通过引用捕捉全部变量

指定空白的捕捉块[]表示不从所在作用域中捕捉变量.

还能够指定捕捉哪些变量以及这些变量的捕捉方法.

[&x],仅仅通过引用捕捉x,不捕捉其它变量.

[x] 仅仅通过值捕捉x,不捕捉其它变量.

[=,&x,&y],默认值捕捉,变量x,y是例外,通过引用捕捉.

[&,x],默认引用捕捉,X通过值捕捉.

[&x,&x],非法,标识符不同意反复.





先看一个简单的不捕捉不论什么变量的样例.

#include <iostream> 

using namespace std; 

int main(){ 





int n=6; 

int k=99; 

cout<<"In first n="<<n<<"   k="<<k<<endl; 

[](){n=n*2,k=k+1;}(); 

cout<<"now n="<<n<<"   k="<<k<<endl; 

}

结果

能够看到,未被捕获的变量不能在lambda里面使用.





再来看看通过值捕捉

#include <iostream> 

using namespace std; 

int main(){ 





int n=6; 

int k=99; 

cout<<"In first n="<<n<<"   k="<<k<<endl; 

[=](){n=n*2,k=k+1;}(); 

cout<<"now n="<<n<<"   k="<<k<<endl; 

}

结果:





先来看看上一节中关于mutable的介绍:

mutable:(可选):假设所在作用域的变量是通过值捕捉的,那么lambda表达式的主体中就不能改动这些副本的值.这些副本默认标记为const,因此lambda表达式主体不能改动这些副本的值.假设lambda表达式标记为mutable,那么这些副本则不是const,因此主体能够改动这些本地副本.(类似于參数传递中的值传递以及引用传递改动源值)





因此,假设想在lambda中改动捕获的值,应声明为mutable

#include <iostream> 

using namespace std; 

int main(){ 





int n=6; 

int k=99; 

cout<<"In first n="<<n<<"   k="<<k<<endl; 

[=]()mutable{n=n*2,k=k+1;}(); 

cout<<"now n="<<n<<"   k="<<k<<endl; 

}

结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE4NDQzNTIxNTU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">



为什么改动了之后,m和k的值都不变呢?原因是事实上通过值捕获的都是副本来的,细致看mutable就能够看到了.









那么通过引用捕捉呢?

#include <iostream> 

using namespace std; 

int main(){ 





int n=6; 

int k=99; 

cout<<"In first n="<<n<<"   k="<<k<<endl; 

[&]()mutable{n=n*2,k=k+1;}(); 

cout<<"now n="<<n<<"   k="<<k<<endl;

}

能够看到,仅仅有通过引用捕获,才干改动外部变量的值!

关于lambda捕捉块的介绍就到这里了.

c++11新特性(4) lambda捕捉块的更多相关文章

  1. C++11新特性之一——Lambda表达式

    C++11新特性总结可以参考:http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html#section_6.8 C++ ...

  2. C++11新特性(3) lambda表达式(1)

    C++11加入了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解. lambda表达式包括下面部分. [capture_block] ...

  3. C++11 新特性:Lambda 表达式

    参考文章:https://blogs.oracle.com/pcarlini/entry/c_1x_tidbits_lambda_expressions 或许,Lambda 表达式算得上是 C++ 1 ...

  4. c++11 新特性之lambda表达式

    写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input paramete ...

  5. C++11新特性:Lambda函数(匿名函数)

    声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译 ...

  6. C++11 新特性之 Lambda表达式

    lambda表达式能够用于创建并定义匿名的函数对象,以简化编程工作 Lambda的语法例如以下: [函数对象參数](操作符重载函数參数)->返回值类型{函数体} []内的參数指的是Lambda表 ...

  7. [转载] C++11新特性

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

  8. 在C++98基础上学习C++11新特性

    自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...

  9. C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)

    因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...

随机推荐

  1. Android加载图片小结

    应用中用到图片加载需要解决的问题 无网络环境下图片不可用 图片的本地缓存,或者默认预加载的图片 低配置机型,加载图像资源超内存(OutOfMemory, OoM) 需要合理使用内存,尤其是bitmap ...

  2. js-计算器

    <div class="main"><h1>HTML5-计算器</h1>            <input id="num1& ...

  3. 在 Windows Azure 虚拟机中使用 Microsoft SQL Server 安全功能

    编辑人员注释:本文章由 SQL Server 团队高级项目经理 Sung Hsueh 撰写. SQL Server 的最新用法之一是利用 Microsoft 的 Windows Azure 基础结构服 ...

  4. 分析java中clone()方法 (转载+修改)

    Java中的clone() 方法 java所有的类都是从java.lang.Object类继承而来的,而Object类提供下面的方法对对象进行复制. protected native Object c ...

  5. 2014第16周三CSS布局再学习摘录

    今天尝试写了下前端页面,费了不少时间,做出的结果仍然惨不忍睹,感觉很简单的几个页面,在现有框架多个样式混杂下就是感觉很不自在随意,晚上回来又看了些div+css方面的基础知识. 1.CSS的class ...

  6. 初识Maven

    今天开始学习怎样使用maven,听起来挺神奇的东西,我们来一步一步的加以剖析. Maven的一些具体的论文的东西,网上很多博客介绍,这里我就不逐一介绍,下面我们从安装maven开始讲解: (1)Mav ...

  7. asp.net MVC Razor 语法(1)

    Razor 不是编程语言.它是服务器端标记语言. 什么是 Razor ? Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法. 当网页被写入浏览器时, ...

  8. Win32下C++遍历目录和文件的源码

    #include<windows.h> #include<iostream> #include<string> using namespace std; //只能处 ...

  9. vs 2005 在IE下断点不起作用

    vs2005 加断点调试,ie下不起作用. 1. 点击[开始]->[运行] 命令:regedit. 2. 定位到HKEY_LOCALMACHINE -> SOFTWARE -> Mi ...

  10. Qt(QML)本地化

    Internationalization and Localization with Qt Quick 程序国际化 1) Use qsTr() for all  Literial UI strings ...