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; };