C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下:
1 2 3 4 5 6 7 8
[捕获列表] (参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
//计算两个值的和 auto func = [](int a, int b) -> int{return a+b;}; //当返回值的类型是确定时,可以忽略返回值 auto func = [](int a, int b){return a + b;}; //调用 int sum = func(1, 3);
int test = 10; //编译报错,test成员不能修改 auto func = [test](int a, int b){test = 8; return a + b + test;}; //编译正常 auto func = [test](int a, int b)mutable {test = 8; return a + b + test;};
int test = 10; auto func = [=](int a, int b){return a + b + test;}; auto func2 = [test](int a, int b){return a + b + test;}; int sum = func(1, 3); //sum等于14
这里需要注意的是func表达式中test的值只更新到表达式之前:
1 2 3 4
int test = 10; auto func = [=](int a, int b){return a + b + test;}; test = 5; int sum = func(1, 3); //sum还是等于14
捕获列表按引用传递
1 2 3 4
int test = 10; auto func = [&](int a, int b){test = 5; return a + b + test;}; auto func2 = [&test](int a, int b){test = 5; return a + b + test;}; int sum = func(1, 3); //sum等于9,test等于5
这里func表达式中test的值就能随时更新:
1 2 3 4
int test = 10; auto func = [&](int a, int b){return a + b + test;}; test = 5; int sum = func(1, 3); //sum等于9,test等于5