一:概述
1. 语法
[ captures ] ( params ) specifiers exception -> ret { body }其中:captures 是捕获列表,用于捕获当前函数作用域的变量,分为按值捕获和按引用捕获。params 是可选参数列表,和普通函数一样。specifiers 是可选限定符,C++中可以用mutable,它允许在lambda中改变按值。exception 是可选异常说明符,C++中使用noexcept指明lambda是否会抛出异常ret 是可选返回值类型。
2. 例子
#include <iostream>
int main()
{int a = 10;auto foo = [a](int b)->int { return a * b; };std::cout << foo(8) << std::endl;
}
二:注意事项
1. 静态变量和全局变量在lambda表达式中直接使用
#include <iostream>
int a = 1;
int main()
{int b = 2;static int c = 3;auto foo = [b] { return a + b + c; };std::cout << foo() << std::endl;
}
2. 按值捕获变量在lambda中不能修改。
void test()
{int x = 10, y = 5;auto foo = [x, y] {x += 1; // 编译失败,无法改变xy += 2; // 编译失败,无法改变yreturn x * y;};std::cout << foo() << std::endl;
}
3. mutable的作用是可以修改按值捕获的变量
void test()
{int x = 10, y = 5;auto foo = [x, y] () mutable {x += 1; y += 2; return x * y;};std::cout << foo() << std::endl;
}