- 匿名函数就是没有名字的函数。有一些函数只是临时用一下,而且业务逻辑也比较的简单,相当于是临时工,就没必要给它定义成一个正常函数(包含有函数名,很正式的那种)。使用临时的匿名函数,可以减轻函数的数量,让代码变的清晰易读。
C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下:
[capture](parameters)->return-type{body}
[ ]
是指闭包,闭包是指在Lambda函数之外声明的变量,Lambda函数可以引用这些变量,这些变量的集合叫做闭包。在[ ]里面可以定义变量是按值或这引用来捕获。捕获的含义就是:按照什么类型来获取的变量。即使没有引用外部变量,也不能省略。
( )
是指Lambda函数中用到的参数,这些参数是Lambda函数自己定义的局部变量。没有自定义的参数,可以省略。
return-type
:是值Lambda函数运行完后,返回值的类型。如果没有返回值,可省略不写。
{body}
:Lambda函数操作主体。
例
[](int x, int y) { return x + y; } // 隐式返回类型
[](int& x) { ++x; } // 没有return语句 -> lambda 函数的返回类型是'void'
[]() { ++global_x; } // 没有参数,仅访问某个全局变量
[]{ ++global_x; } // 与上一个相同,省略了()
[](int x, int y) -> int { int z = x + y; return z; }
Lambda函数可以引用在它之外声明的变量. 这些变量的集合叫做一个闭包. 闭包被定义在Lambda表达式声明中的方括号[]内. 这个机制允许这些变量被按值或按引用捕获.下面这些例子就是:
[] //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
[x, &y] //x 按值捕获, y 按引用捕获.
[&] //用到的任何外部变量都隐式按引用捕获
[=] //用到的任何外部变量都隐式按值捕获
[&, x] //x显式地按值捕获. 其它变量按引用捕获
[=, &z] //z按引用捕获. 其它变量按值捕获