C++17 lambda表达式捕获this 写法
时间: 2023-07-06 12:04:38 浏览: 679
在C++17中,可以使用以下两种方式来捕获`this`指针:
1. 隐式捕获:
```c++
auto lambda = [this](){
// lambda函数体
};
```
在lambda表达式中使用`[this]`来隐式捕获当前对象的`this`指针。
2. 显式捕获:
```c++
auto lambda = [ptr = this](){
// lambda函数体
};
```
在lambda表达式中使用`ptr = this`来显式捕获当前对象的`this`指针,并将其存储为一个命名的变量`ptr`。这种方式的好处是可以避免在lambda函数体中使用`this`指针的影响。
相关问题
C++lambda表达式的所有写法
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`关键字允许在递归调用内部修改函数自身。
C++lambda表达式常见的几种写法
C++ lambda表达式有多种常见写法,根据需要捕获外部变量、参数列表以及返回类型的不同,可以分为简单形式和复杂形式。以下是三种常见写法:
1. **简单无参无返回值的形式**:
```cpp
auto square = []() { return x * x; }; // 如果x是自由变量
```
2. **带参数和返回值的形式**:
```cpp
auto addFive = [](int num) -> int { return num + 5; };
```
3. **捕获外部变量(by value)**:
```cpp
void outerFunction(int x) {
auto innerLambda = [x] { cout << "x is: " << x << endl; };
}
```
4. **捕获外部变量(引用)**:
```cpp
void outerFunction(int& x) {
auto innerLambda = [&x] { cout << "x is: " << x << endl; };
}
```
5. **捕获特定范围内的外部变量(按需捕获)**:
- `[]` 表示当前作用域(default捕获)
- `[=]` 或 `[capture(this)]` 表示所有外部变量(copy capture)
- `[&]` 表示所有外部变量作为引用(reference capture)
6. **多行Lambda表达式**:
可以通过`{}`包裹多条语句:
```cpp
auto complexLambda = [i](int j) {
int result = i * j;
if (result > 10) {
return result;
} else {
return 0;
}
};
```
记住,Lambda表达式的灵活性取决于你需要处理的情况,选择合适的捕获方式和参数列表可以使代码更简洁易懂。
阅读全文