?[capture] (params) opt->ret { bady };
capture:捕获列表
params:参数列表
opt:函数选项
ret:返回值类型
bady:函数体
auto f = []{int a} -> int {return a + 1;};
std::cout<<f(1)<<std::endl; //输出:2
//c++11中可以省略返回值定义:
auto f = [](int a){return a + 1;};
//没有参数时,参数列表可省略,例如:
auto f1 = [](){return 0;};
auto f1 = []{return 0;}; //省略空参数列表
[]不捕获任何变量。
[&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
[=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
[=, &foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。
[bar]按值捕获bar变量,同时不捕获 其他变量。
[this]捕获当前类中的this指针,让表达式拥有和当前类成员函数同样的访问权限,如果已经使用=或者&,就默认添加此选项。
例如:
class A
{
public:
int i = 0;
void func(int x, int y)
{
auto x1 = []{return i;}; //error,没有捕获外部变量
auto x2 = [=]{return i + x + y;}; //ok,捕获所有外部变量
auto x3 = [&]{return i + x + y;}; //ok,捕获所有外部变量
auto x4 = [this]{return i;}; //ok,捕获this指针
auto x5 = [this]{return i + x + y;}; //error,没有捕获x,y
auto x6 = [this, x, y]{return i + x + y;}; //ok,捕获this指针、x、y
auto x7 = [this]{return i++;}; //ok,捕获this指针,并修改成员值
}
};
int a = 0, int b = 1;
auto f1 = []{return a;}; //error,没有捕获外部变量
auto f2 = [&]{return a++;}; //ok,捕获所有外部变量,并对a执行自加运算
auto f3 = [=]{return a;}; //ok,捕获所有外部变量,并返回a
auto f4 = [=]{return a++;}; //error,a是以复制方式捕获的,无法修改
auto f5 = [a]{return a + b;}; //error,没有捕获变量b
auto f6 = [a, &b]{return a + (b++);}; //ok,捕获a和b的引用,并对b做自加运算
auto f7 = [=, &b]{return a + (b++);}; //ok,捕获所有外部变量和b的引用,并对b做自加运算
//再捕获的一瞬间,a的值已经被复制到了f中,之后再修改a的值,此时f中存储的a仍然是之前捕获到的值。
int a = 0;
auto f = [=]{return a;}; //按值捕获外部变量
a += 1; //a被修改
std::cout<<f()<<std::endl; //输出0
//使用mutable:
int a = 0;
auto f1 = [=]{return a++;}; //error,a是以复制方式捕获的,无法修改
auto f2 = [=]() mutable {return a++;}; //ok, 使用mutable
//注意:在使用mutable修饰的lambda表达式就算没有参数也要写明参数列表。
/*
*lambda表达式的operator()默认是const的,
*一个const成员函数是无法修改成员变量的值的,
*mutable的作用在于取消operator()的const
*/