// [捕获](参数) -> 返回类型 { 函数体 }auto add = [](int a, int b) -> int { return a + b; };auto add2 = [](int a, int b) { return a + b; }; // 返回类型可省略cout << add(3, 5); // 8
捕获列表
int x = 10, y = 20;// 按值捕获(默认不可修改)auto f1 = [x, y] { return x + y; }; // 捕获副本// 按引用捕获auto f2 = [&x, &y] { x++; y++; }; // 修改外部变量// mutable — 允许修改值捕获的副本auto f3 = [x]() mutable { x++; return x; };// 默认捕获方式auto f4 = [=] { return x + y; }; // 全部按值auto f5 = [&] { x++; y++; }; // 全部按引用// 混合捕获auto f6 = [=, &y] { return x + y; }; // y 引用,其余值auto f7 = [&, x] { return x + y; }; // x 值,其余引用// C++14 初始化捕获(移动)auto p = make_unique<int>(42);auto f8 = [p = move(p)] { return *p; };// C++14 捕获表达式auto f9 = [y = x + 5] { return y; }; // 捕获时计算一次
捕获的本质
int x = 42;auto lambda = [x] { return x; };// 编译器大致生成:class __lambda { int x; // 按值捕获 = 成员变量public: __lambda(int arg) : x(arg) {} auto operator()() const { return x; } // 调用运算符};// 按引用捕获 = 成员变量是引用类型
实战场景
STL 算法
vector<int> v = {1, 2, 3, 4, 5, 6};// 条件删除v.erase(remove_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; }), v.end());// 自定义排序sort(v.begin(), v.end(), [](int a, int b) { return abs(a) < abs(b); });// 查找int threshold = 3;auto it = find_if(v.begin(), v.end(), [threshold](int x) { return x > threshold; });// 变换transform(v.begin(), v.end(), v.begin(), [](int x) { return x * x; });