C++ Lambda 速查表

1. 基本结构

[captures](params) -> return_type { body }
  • captures:捕获外部变量(by value/by reference/this/…)
  • params:参数列表(和普通函数一样)
  • -> return_type:可选,显式返回类型
  • body:函数体

2. 常见写法

用法 示例 说明
空捕获 [](){ std::cout << "hi"; } 不依赖外部变量
捕获值 [x](){ return x+1; } 拷贝一份 x
捕获引用 [&x](){ x++; } 操作外部 x
捕获 this [this](){ foo(); } 调用类成员函数/变量
捕获所有值 [=](){ return a+b; } 捕获作用域内所有变量(值拷贝)
捕获所有引用 [&](){ a++; b++; } 捕获作用域内所有变量(引用)
指定多个 [=,&y](){ y++; return x+y; } 除 y 用引用,其他用值

3. 参数形式

用法 示例 说明
无参数 [](){ std::cout << "ping"; } 和函数 void f() 一样
单参数 [](int a){ return a*a; } 类似 int f(int)
多参数 [](int a, int b){ return a+b; }
auto 参数 (C++14+) [](auto x){ return x*2; } 泛型 lambda

4. 返回类型

用法 示例 说明
自动推断 [](int a){ return a*2; } 返回类型由表达式推断
显式 void []() -> void { std::cout<<"x"; } 明确表示无返回值
解决歧义 [](bool b) -> double { if(b) return 3.14; return 2; } 强制返回 double,避免 int/double 冲突

5. 多行函数体

auto f = [](int a, int b) {
    int c = a+b;
    return c*2;
};

6. 作为变量 / 参数

  • 存到变量里:
    auto f = [](int x){ return x+1; };
    std::cout << f(5); // 6
    
  • 传给算法:
    std::vector<int> v{1,2,3};
    std::for_each(v.begin(), v.end(),
                  [](int x){ std::cout<<x<<" "; });
    
  • 绑定到 std::function(需要类型擦除时):
    std::function<int(int)> f = [](int x){ return x*2; };