Lambda表达式在c++11之后引入。
完整形式
[ captures ] ( params ) specs requires (optional) { body }
captures :已存在局部变量的捕获列表
param:函数输入参数列表,除捕获的变量外,调用时可以传入参数
specs :函数选项,对函数进行修饰,可以用mutable,constexpr,static等,可以不写
requires (optional):暂时不明白,不过这个位置可以放函数返回类型限制。
body:函数体
具体参考:
C++多线程:Lambda表达式
外部参数捕获
全局变量可以直接使用
局部变量需要捕获
- [] () {}:默认情况,没有捕获外部变量,只能使用全局变量
- [=] () {}:值拷贝捕获,将所有局部变量的值进行拷贝,此时可是使用局部变量和全局变量。但局部变量是只拷贝不能修改。定义一次后任何时候都可以再反复调用,但是该函数中捕获的局部变量不会因为外部的变量值改变而改变。
- [&] () {}:引用捕获,捕获所有局部变量的引用。捕获的这些局部变量具体的值在函数实际运行时才确定
- [=,&j,&k]:默认拷贝方式,对特定变量使用引用捕获,其他的变量均为值拷贝捕获
- [&,j,k]:默认引用方式,对特定变量使用值拷贝捕获,其他的变量均为引用捕获
- [j, &k]:不考虑默认方式,只针对个别想要的值进行捕获,未列出来的能使用
- [this]:定义在类内部的lambda不能直接访问类成员变量和成员函数,如果要访问,需要对this指针进行捕获
使用值拷贝捕获是最安全的一种方式,使用引用捕获需要注意在函数运行期间需要保证捕获的局部变量一直存在
参数输入
capture是用于捕获局部变量的,但是只能捕获函数定义的时候就存在的变量。当我们需要在函数调用时传入新的参数给lambda表达式时就需要使用参数列表进行输入,即param
- [=](int a){}:等号是用来捕获局部变量的,int a 就是我们定义调用这个lambda需要传递的参数,这个和不同函数一样