在C++中,lambda表达式是一种轻量级的匿名函数,可以在需要定义短小的、一次性使用的函数时非常方便。Lambda表达式的语法如下:
[capture](parameters) -> return_type {
// function body
}
语法详解
1、[capture]: 捕获列表,用于指定在lambda表达式中如何捕获上下文中的变量。可以使用以下几种方式:
- [&]:通过引用捕获所有外部作用域中的变量。
- [=]:通过值捕获所有外部作用域中的变量。
- [&x, y]:通过引用捕获变量 x,通过值捕获变量 y。
- [this]:捕获当前类的this指针,以便在lambda表达式中访问类的成员变量和成员函数。
2、(parameters): 参数列表,类似于普通函数的参数列表。如果不需要参数,可以省略括号。
3、-> return_type: 返回类型,可以省略,如果编译器可以推断出返回类型的话。若省略,返回类型由函数体中的 return 语句推断。
4、{ // function body }: 函数体,包含lambda表达式的逻辑。
例子
1. 没有捕获的lambda表达式
auto lambda = []() {
std::cout << "Hello, Lambda!" << std::endl;
};
lambda(); // 输出: Hello, Lambda!
这是一个简单的lambda表达式,不捕获任何外部变量,不接受任何参数,只打印一行文字。
2. 捕获外部变量的lambda表达式
int x = 10;
auto lambda = [x]() {
std::cout << "x = " << x << std::endl;
};
lambda(); // 输出: x = 10
这里,lambda表达式通过值捕获了外部变量 x。即使在lambda表达式定义之后,外部的 x 发生变化,lambda表达式内部的 x 值仍然是定义时的值。
3. 修改捕获的变量
int x = 10;
auto lambda = [&x]() {
x = 20;
};
lambda();
std::cout << x << std::endl; // 输出: 20
通过引用捕获变量 x,lambda表达式可以修改 x 的值。