c++ lambda表达式 捕获方式
时间: 2023-07-07 17:43:51 浏览: 109
在 Lambda 表达式中,捕获列表用于指定要捕获的外部变量。捕获列表可以包含以下 3 种方式:
1. 捕获值
捕获值可以通过在捕获列表中指定变量的方式来完成。在捕获值时,Lambda 表达式会在创建时将指定的变量复制一份,并在函数体中使用这份副本。例如:
```c++
int x = 1;
auto func = [x]() { std::cout << x << std::endl; };
```
在上面的代码中,Lambda 表达式通过捕获值的方式来捕获变量 x。在 Lambda 表达式中使用的变量 x 是一个拷贝,对其进行修改不会影响原有的变量 x。
2. 捕获引用
捕获引用可以通过在捕获列表中指定变量的方式来完成。在捕获引用时,Lambda 表达式会在创建时将指定的变量的引用传递给函数体。例如:
```c++
int x = 1;
auto func = [&x]() { std::cout << x << std::endl; };
```
在上面的代码中,Lambda 表达式通过捕获引用的方式来捕获变量 x。在 Lambda 表达式中使用的变量 x 是原有变量的引用,对其进行修改会影响原有的变量 x。
3. 捕获列表
捕获列表可以通过在捕获列表中指定变量的方式来完成。在捕获列表中,可以同时指定多个变量,并且可以使用值或引用的方式进行捕获。例如:
```c++
int x = 1, y = 2;
auto func = [x, &y]() { std::cout << x << " " << y << std::endl; };
```
在上面的代码中,Lambda 表达式通过捕获列表的方式来捕获变量 x 和 y。变量 x 是以值的方式进行捕获的,变量 y 是以引用的方式进行捕获的。
需要注意的是,在 Lambda 表达式中捕获变量时,要考虑变量的生命周期。如果捕获了一个局部变量,而且这个局部变量已经超出了作用域,那么在 Lambda 表达式执行时可能会引发未定义的行为。为了避免这种情况,可以使用捕获值或捕获引用的方式来避免变量超出作用域的问题。
阅读全文