封闭函数局部变量不能在lambda体中引用,除非其位于捕获列表中
时间: 2024-09-15 19:03:12 浏览: 343
Java中Lambda表达式之Lambda语法与作用域解析
封闭函数(也称为外部函数或自由变量)是指在lambda表达式内部声明但不属于lambda自身作用域的变量。在C++等支持lambda的编程语言中,由于lambda的作用域仅限于它自身的定义范围,因此如果想要在lambda体内访问并修改这些外部函数的局部变量,你需要通过捕获列表来指定这些变量。
捕获列表是一种语法,允许你在lambda表达式的花括号 `{}` 内指定如何访问外部变量。有三种捕获方式:
1. **无捕获** (`[]`):不捕获任何外部变量,这意味着lambda内部无法访问外部函数的局部变量。
2. **按值捕获** (`=`):捕获并复制该变量的副本,无论外部变量是否改变,lambda内的副本都不会受到影响。
3. **按引用捕获** (`&`) 或者 **成员捕获** (`this`):捕获的是外部变量的原始引用,这使得lambda能够直接看到并影响外部变量的当前状态。
如果你需要在lambda中引用和修改封闭函数的局部变量,就需要将其放在捕获列表中明确地指定。例如:
```cpp
int x = 10;
auto lambda = [x](int y) { x += y; }; // 使用按引用捕获 x
lambda(5); // 修改了x的值
```
在这里,`x` 被按引用捕获,所以可以在lambda体中直接操作。
阅读全文