1.介绍
Lambda表达式是一个匿名函数,即没有名的函数
是c++11新添加的特性,使用时要注意编译器是否支持C++11,其目的是为了是简化编程工作,底层实现可以理解成仿函数
2.语法
[capture list] (parameter list) mutable -> return type { function body }
capture list: 捕获列表,一定不可以省略
params list:参数列表,可以通过按值或者按引用传递 ,可以省略
mutable:可选项,可以省略
ret:返回值,如果编译器能够自动推导出返回值类型,这里也可以省略
function body:函数体,一定不可以省略
综上最简单的Lambda表达式就是形如 [] {}的样子
3. 捕获列表
[] 不捕获任何变量
[&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)
[=]捕获外部作用域中所有变量,并作为副本在函数体重使用(按值捕获)
[=,&foo] 按值捕获外部作用域中所有变量,并按引用捕获foo变量
[&,=foo] 按引用捕获外部作用域中所有变量,并按值捕获foo变量
[bar] 按值捕获bar变量,同时不捕获其他变量
[this] 捕获当前类中的this指针,让表达式拥有和当前类成员函数同样的访问权限。
注1:捕捉列表按值传捕获有常性,要加mutable后才能修改拷贝后的副本,按引用捕获不具有常性,参数列表也不具有常性。
注2:捕捉列表只能捕捉当前作用域的局部变量,作用域以外的局部变量或者非局部变量都会报错。
注3:lambda表达式之间不能赋值,即使看起来类型相同。
4.使用
法1:先定义一个函数对象去接受匿名函数对象,然后再调用该函数
auto f1 = []() { cout << "Hello world!"; };
f1();
法2:定义的同时直接使用
[]() {cout << "Hello C++!"; } ();
有关捕获列表的一些使用,按照说明简单敲几个代码,就可以理解了!