C++中的Lambda表达式是一种方便的定义匿名函数对象的方式。自C++11起,Lambda表达式被引入为C++的一部分。以下是Lambda表达式的基本语法和一些变体。
基本语法:
[ capture_clause ] ( parameters ) -> return_type {
function_body
}
- capture_clause: 捕获列表,定义了Lambda表达式可以从封闭作用域(通常是定义Lambda的函数)捕获的变量。它可以是值捕获、引用捕获或隐式捕获。
- parameters: 参数列表,与普通函数的参数列表类似。
- return_type: 返回类型,可以不写,编译器会自动推导。
- function_body: 函数体,包含Lambda表达式要执行的代码。
捕获列表的选项:
[]
: 不捕获任何外部变量。[x, &y]
: 按值捕获x
,按引用捕获y
。[=]
: 按值捕获所有外部变量。[&]
: 按引用捕获所有外部变量。[=, &y]
: 按值捕获所有外部变量,但按引用捕获y
。[&, x]
: 按引用捕获所有外部变量,但按值捕获x
。[this]
: 捕获当前对象(*this
)的指针。
示例:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
int x = 10;
int y = 20;
// 值捕获
auto lambda_val = [x]() { std::cout << "Value of x: " << x << std::endl; };
lambda_val(); // 输出: Value of x: 10
// 引用捕获
auto lambda_ref = [&y]() { std::cout << "Value of y: " << y << std::endl; };
lambda_ref(); // 输出: Value of y: 20
// 修改捕获的引用变量
auto add_to_y = [&y](int val) { y += val; };
add_to_y(5); // y 现在是 25
// 隐式值捕获
auto sum = [=]() { return x + y; };
std::cout << "Sum: " << sum() << std::endl; // 输出: Sum: 35
// 隐式引用捕获
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::for_each(numbers.begin(), numbers.end(), [&](int &n) { n *= 2; });
// 带返回类型
auto max = [](int a, int b) -> int { return a > b ? a : b; };
std::cout << "Max of 3 and 5: " << max(3, 5) << std::endl; // 输出: Max of 3 and 5: 5
// 无参数Lambda
auto say_hello = []() { std::cout << "Hello, World!" << std::endl; };
say_hello(); // 输出: Hello, World!
return 0;
}
Lambda表达式非常灵活,支持几乎所有的函数能做的事情,并且由于其匿名性质,Lambda表达式常被用于简化代码,特别是在STL算法中作为回调函数使用。在C++14和C++17中,Lambda表达式得到了进一步的增强,包括捕获列表中的初始化捕获(C++14)和模板参数(C++20)。