一.概念
1.利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象
2.每当你定义一个lambda表达式后,编译器会自动生成一个匿名类(这个类当前重载了()运算符),我们称为闭包类型(closure type)。那么在运行时,这个lambda表达式就会返回一个匿名的闭包实例,就是一个右值。
所以,lambda表达式的结果就是一个个闭包。闭包的一个强大之处是其可以通过传值或者引用的方式捕捉其封装作用域的变量,前面的方括号就是用来定义捕捉模式以及变量,我们称之为lambda模块。
3.lambda表达式的语法定义如下
[capture] (parameters) mutable->return-type{statement};
即[捕捉列表](参数)mutable ->返回值 {函数体}
4.lambda 必须使用尾置返回来指定返回类型,可以忽略参数列表和返回值,但必须永远包含捕获列表和函数体。
二.示例
1.捕获列表
-
[=] 按值捕获作用域内所有变量
-
[&] 按引用捕获作用域内所有变量
-
[ed,&] 按值捕获ed变量,按引用捕获作用域内其他所有变量
-
[&ed,=] 按引用捕获ed变量,按值捕获作用域内其他所有变量
- [this] 函数体可以使用lambda函数所在类中的成员变量
2.例子
(1)匿名lambda函数
[=](string A) {cout << A;}(A);//直接传入参数
(2)基本使用
string A = "aba";string B = "b";string C = "12345";auto fun = [A,&B,C]{//没有返回值B += (A + C);cout << B << endl;};auto fun1 = [A, &B, C]{//有返回值B += (A + C);cout << B << endl;return B;};fun();cout << fun1();