c++ lambda表达式 捕获列表 [] [=] [&]
时间: 2023-08-17 09:31:47 浏览: 105
在 Lambda 表达式中,捕获列表用于指定要捕获的外部变量。捕获列表可以使用以下 3 种方式之一:
1. [] 空捕获列表
空捕获列表表示不捕获任何外部变量,Lambda 表达式中只能使用全局变量和参数。
```c++
[]() { std::cout << "Hello, world!" << std::endl; };
```
2. [=] 按值捕获
按值捕获表示通过值的方式捕获所有外部变量。Lambda 表达式中使用的变量将被复制一份,并在函数体中使用这份副本。
```c++
int a = 1, b = 2;
[=]() { std::cout << a + b << std::endl; };
```
在上面的代码中,Lambda 表达式使用了按值捕获的方式,捕获了变量 a 和 b。在 Lambda 表达式中使用的变量 a 和 b 都是拷贝,对其进行修改不会影响原有的变量。
3. [&] 按引用捕获
按引用捕获表示通过引用的方式捕获所有外部变量。Lambda 表达式中使用的变量将直接作为引用传递给函数体。
```c++
int a = 1, b = 2;
[&]() { std::cout << a + b << std::endl; };
```
在上面的代码中,Lambda 表达式使用了按引用捕获的方式,捕获了变量 a 和 b。在 Lambda 表达式中使用的变量 a 和 b 都是原有变量的引用,对其进行修改会影响原有的变量。
需要注意的是,当使用按引用捕获时,Lambda 表达式中使用的外部变量必须存在于 Lambda 表达式所在的作用域中。如果使用了一个已经超出作用域的变量,编译器会产生一个错误。
阅读全文