C++lambda表达式的所有写法
时间: 2024-10-13 14:05:51 浏览: 26
C++14标准(中文)
C++ lambda表达式提供了一种简洁的方式来定义匿名函数,它们通常用于函数对象(functor),可以作为参数传递给其他函数,或者在需要临时函数的地方使用。这里有两种主要的写法:
1. **基础形式**[^2]:
```cpp
auto f = [] (int a) -> int {
return a + 1;
};
```
这里,`[]`是lambda捕获列表(capture list),`(int a)`是参数列表,`-> int`是返回类型。
2. **自省形式**(如果需要访问外部作用域的变量):
```cpp
int x = 10;
auto f = [x] (int a) -> int {
return a + x;
};
```
`x`被自动捕获(按值)。
3. **捕获列表明确指定**:
```cpp
auto f = [this] (int a) -> int {
return a + this->x; // 如果x是成员变量
};
```
或者
```cpp
auto f = [i = 0] (int a) -> int {
return a + i++;
};
```
使用`[=]`表示不捕获任何东西,`[&]`表示捕获所有按引用,`[i]`捕获单个变量`i`。
4. **默认参数**:
```cpp
auto f = [default_value = 0] (int a = default_value) -> int {
return a + default_value;
};
```
5. **嵌套lambda**:
```cpp
auto outer = [] {
auto inner = [] (int a) -> int {
return a * a;
};
return inner(3);
};
std::cout << outer(); // 输出: 9
```
6. **递归lambda**[^1](仅限于C++11及以上版本):
```cpp
auto factorial = [f = &factorial](unsigned n) mutable -> unsigned {
if (n == 0)
return 1;
else
return n * f(n - 1);
};
std::cout << factorial(5); // 输出: 120
```
注意`mutable`关键字允许在递归调用内部修改函数自身。
阅读全文