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. threadid=1: thread exiting with uncaught exception (group=0x40db8930)

    异常信息如下: 07-26 17:23:49.521: W/dalvikvm(29229): threadid=1: thread exiting with uncaught exception (g ...

  2. what oop ?

    最近在做一个app的后台代码.......到底是什么是Oop ,没有感觉到啊,,,,,

  3. 一个大小为N的数组,里面是N个整数,怎样去除重复的数

    题目:一个大小为N的数组,里面是N个整数,怎样去除重复的数字: 要求时间复杂度为O(n),空间复杂度为O(1). 需要除掉重复的整数的数组,注意这里我没有处理负数情况,其实负数情况只要先用0快排分一下 ...

  4. /dev/null &

    java -cp .:ojdbc14.jar com.eucalyptus.dataguard.DBCheck dadifilm slbcheck Aa7788123 > /dev/null & ...

  5. iOS禁用部分文件ARC

    TARGETS的build Phases中的Compile Source里修改文件备注文件参数设定: 增加-fobjc-arc来使单个文件 支持ARC,或者添加-fno-objc-arc使单个文件不支 ...

  6. android退出activity的方式总结(一)

    在android中使用:[activityname].this.finish();  只是退出了activity的堆栈中,要真正的退出程序在手机cpu中的运行,当应用不再使用时,通常需要关闭应用,可以 ...

  7. Java socket字节流传输的示例

    服务端server端: package com.yuan.socket; import java.io.*; import java.net.ServerSocket; import java.net ...

  8. symbolを見つけられませんの解決策

    类互相调用造成编译时找不到符号symbol 可以同时编译多个文件:

  9. java计算器

       由于自己的实验报告 需要用Java来写一个实验报告.自己本没有怎么学过Java,但是学的话也就认真的学一下,毕竟技术这条路线是技多不压身.于是在网站上找来了一些资料,关于Java到底是干什么的, ...

  10. PHP开发APP接口

    第1章 APP接口简介 - 课程简介 (:) - APP接口介绍 (:) - 客户端APP通信 (:) 最近学习 - 客户端APP通信格式区别 (:) - APP接口做的哪些事儿 (:) 第2章 封装 ...