参考链接:
https://msdn.microsoft.com/zh-cn/library/dd293603(v=vs.110).aspx
https://msdn.microsoft.com/zh-cn/library/dd293608(v=vs.110).aspx
关于C++ Lambda表达式的汇编实现分析:
http://my.oschina.net/ybusad/blog/277445?fromerr=bNPdTMGh
第一次发表博客,请各位路过的有错请批评,也多给点建议:)
概要
C++在C11版本时支持Lambda表达式,至于什么是Lambda? Lambda表达式是一种“匿名函数”,没错它不需要名字,并且可以很自由的让它穿插在各种表达式中,当然也可以让它拥有名字使它变成一个“函数”。这种技术有利有弊,它能使某些工作变得更加灵活,但是也可能使代码变得混乱让人无法。
先体验一下Lambda表达式的使用
int a = 1, b = 2;
int z = [] (int x, int y) -> int { return x + b; } ( a, b ); // 该Lambda表达式计算a和b的和然后赋给z
Lambda表达式的组成
如下图所以Lambda的组成:
(在图中的标注,如下所示:)
- Lambda introduce(外部变量捕获列表)
- 参数声明列表
- mutable描述(不加mutable的话Lambda默认“可理解为const的方法”)
- 异常描述(描述该Lambda表达式可能会抛出什么异常)
- 返回类型
- 复合语句 (Lambda表达式的执行体(函数体))
注:可以把整个Lambda表达式当做是一个函数的名称,“函数名称 + ()”那就是函数调用了。
1. 捕捉列表(Lambda introduce)
“捕捉列表”用于描述在执行体中可以访问那些Lambda所在区域的变量(该Lambda表达式所在的地方要处于该变量的作用域之内)以及怎么访问。
捕捉列表的可能形式(不列出重复的和变形的情形):
[]: 不捕捉Lambda外部的任何变量
[=]: 捕捉外部的所有变量