c++的拉姆达表达式如何通过捕获列表将值传递出去
时间: 2023-09-20 10:12:35 浏览: 80
浅谈C++11新引入的lambda表达式
C++的Lambda表达式可以通过捕获列表来捕获外部变量,并将其传递到Lambda表达式内部。捕获列表可以包含以下三种类型的捕获:
1. 值捕获(Capture by value):通过值捕获,Lambda表达式复制外部变量的值,并将其传递到Lambda表达式内部。值捕获可以使用“=”符号来实现,例如:[=]。
2. 引用捕获(Capture by reference):通过引用捕获,Lambda表达式引用外部变量,并将其传递到Lambda表达式内部。引用捕获可以使用“&”符号来实现,例如:[&]。
3. 显式捕获(Explicit capture):通过显式捕获,Lambda表达式只捕获指定的外部变量,并将其传递到Lambda表达式内部。显式捕获可以使用方括号和变量名来实现,例如:[x, &y]。
下面是一个例子,演示了如何通过捕获列表将值传递到Lambda表达式内部:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
int x = 10;
std::vector<int> v = {1, 2, 3, 4, 5};
// 值捕获
auto lambda1 = [=]() {
std::cout << "x = " << x << std::endl;
};
lambda1(); // 输出:x = 10
// 引用捕获
auto lambda2 = [&]() {
x++;
std::cout << "x = " << x << std::endl;
};
lambda2(); // 输出:x = 11
std::cout << "x = " << x << std::endl; // 输出:x = 11
// 显式捕获
auto lambda3 = [x, &v]() {
std::cout << "x = " << x << std::endl;
std::cout << "v = ";
for (auto i : v) {
std::cout << i << " ";
}
std::cout << std::endl;
};
lambda3(); // 输出:x = 11,v = 1 2 3 4 5
return 0;
}
```
在上面的例子中,Lambda表达式lambda1通过值捕获外部变量x,Lambda表达式lambda2通过引用捕获外部变量x,并对其进行修改,Lambda表达式lambda3通过显式捕获外部变量x和vector v。Lambda表达式内部使用捕获的变量进行输出。
阅读全文