文档章节

Lambda Expressions in C++

NiuYoohoo
 NiuYoohoo
发布于 2017/04/27 09:33
字数 679
阅读 4
收藏 0

  1. 捕捉块(catpure block): 指定如何捕捉所在作用域中的变量,并供给lambda主体使用。
  2. 参数(parameter): (可选)lambda表达式使用的参数列表。只有在不使用任何参数,并且没有自定mutable、一个exception_specification 和一个return_type的情况下可以忽略该列表,返回类型在某些情况下也是可以忽略的,详见对return_type的说明:eg: [] {return 10;}
  3. mutable:(可选)如果所在作用域的变量是通过值捕捉到,那么lambda表达式主体中可以使用这些变量的副本。这些副本默认标记为const,因此lambda表达式的主体不能修改这些副本的值。如果lambda表达式标记为mutable,那么这些副本则不是const,因此主体可以修改这些本地副本。
  4. exception_specification:(可选)用于指定lambda可以抛出的异常。
  5. return_type:(可选)返回值的类型。如果忽略了return_type,那么编译器会根据以下原则判断返回类型:
  6. 如果lambda表达式主体的形式为{return expression;}那么表达式return_type的类型为expression的类型,其他情况下的return_type为void
  • 参数列表和普通函数的参数列表类似,区别如下:
  • 参数不能有默认值。
  • 不允许变长参数列表。
  • 不允许未命名的参数。

lambda表达式的方括号部分称为lambda捕捉块(capture block),在这里可以指定如何从所在作用域中捕捉变量。捕捉变量的意思是可以在lambda表达式主体中使用这个变量。有两种方式:

  • [=]:通过值捕捉所有变量
  • [&]:通过引用捕捉所有变量

指定空白的捕捉块[]表示不从所在作用域中捕捉变量。还可以酌情决定捕捉那些变量以及这些变量的捕捉方法,方法是指定一个捕捉列表,其中带有可选的默认捕捉选项。前缀为&的变量通过引用捕捉。不带前缀的变量通过值捕捉。默认捕捉应该是捕捉列表中的第一个元素,可以是=或&。

例如:

[&x]只通过引用捕捉x,不捕捉其他变量。

[x]只通过值捕捉x,不捕捉其他变量。

[=, &x, &y]默认通过值捕捉,变量x和y例外,这两个变量通过引用捕捉。

[&, x]默认通过引用捕捉,变量x例外,这个变量通过引用捕捉。

[&x, &y]非法,因为标志符不允许重复。

通过引用捕捉变量的时候,一定保证党lambda表达式在执行的时候,这个引用还是可用的。

© 著作权归作者所有

NiuYoohoo
粉丝 1
博文 49
码字总数 18987
作品 0
赣州
私信 提问
Clang 3.1 发布,支持 C++11

Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。 Clang 3.1 支持匿名结构和匿名 union,可使用 =std...

oschina
2012/05/23
3.6K
14
SonarQube C/C++/Objective C 3.11 发布

SonarQube C/C++/Objective C 3.11 发布,这是 Sonar 平台用来检查 C/C++/Objective-C 代码的插件。 更新日志: Bug [CPP-552] - NOSONAR tag should work for preprocessing directives (......

oschina
2016/04/14
773
0
C++11 新特性:Lambda 表达式

参考文章:https://blogs.oracle.com/pcarlini/entry/c1xtidbitslambdaexpressions 或许,Lambda 表达式算得上是 C++ 11 新增特性中最激动人心的一个。这个全新的特性听起来很深奥,但却是很...

雅各宾
2014/07/17
0
0
C++ 0x 之 Lambda:贤妻与娇娃,你娶谁当老婆?听 FP 如何点化 C++

转自:http://blog.csdn.net/hikaliv/article/details/4532980 文 / 李博(光宇广贞) 先以《N1958》提案的开场白,做为本文的开场白吧: A number of languages provide a way of passing c...

长平狐
2013/01/11
98
0
C++11 FAQ中文版:Lambda表达式

二 26 Year 2011 陈 良乔 C++11 FAQ Lambdas (译注:目前支持lambda的gcc编译器版本为4.5,其它详细的编译器对于C++11新特性的支持请参考http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSu...

长平狐
2013/01/11
193
0

没有更多内容

加载失败,请刷新页面

加载更多

JWT学习总结

官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token(......

冷基
今天
4
0
AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
今天
4
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
11
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
5
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部