语法:
[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 */