在C++中,lambda表达式是一种定义匿名函数对象(也称为闭包)的简洁方式,它能够捕获(capture)其所在作用域内的变量,并在函数体内使用这些变量。Lambda表达式在C++11中首次引入,极大地增强了C++的函数式编程能力和表达能力。
Lambda表达式的基本语法
Lambda表达式的基本语法如下:
[capture](parameters) -> return_type { body }
capture
:捕获列表,指定哪些外部变量可以在lambda函数体内被访问。捕获方式可以是按值捕获(值传递)或按引用捕获(引用传递)。parameters
:参数列表,与普通函数的参数列表相同。return_type
:返回类型,可以省略,此时编译器会自动推导返回类型(C++14及更高版本支持)。body
:函数体,包含lambda表达式的具体实现。
示例
下面是一个简单的lambda表达式示例,它计算两个整数的和并返回结果:
#include <iostream>
#include <functional>
int main() {
// 定义一个lambda表达式
auto sum = [](int a, int b) -> int { return a + b; };
// 使用lambda表达式
int result = sum(3, 4);
std::cout << "The sum is: " << result << std::endl;
return 0;
}
在这个例子中,sum
是一个lambda表达式,它接受两个整数参数a
和b
,并返回它们的和。我们使用auto
关键字来自动推导lambda表达式的类型,并将其赋值给变量sum
。然后,我们像调用普通函数一样调用sum
。
捕获列表
捕获列表是lambda表达式的一个关键特性,它允许我们在lambda函数体内访问外部变量。捕获列表的语法是[capture]
,其中capture
可以是以下之一:
[]
:不捕获任何外部变量。[x]
:按值捕获外部变量x
。[&x]
:按引用捕获外部变量x
。[=]
:按值捕获所有外部变量(C++14及更高版本支持)。[&]
:按引用捕获所有外部变量。[=, &x]
:按值捕获所有外部变量,但x
按引用捕获。[&, x]
:按引用捕获所有外部变量,但x
按值捕获。
示例(带捕获列表)
下面是一个带捕获列表的lambda表达式示例:
#include <iostream>
int main() {
int x = 10;
int y = 20;
// 定义一个lambda表达式,捕获x和y
auto increment_and_sum = :ml-search[&x, y] -> int {
x++;
return x + y;
};
// 使用lambda表达式
int result = increment_and_sum();
std::cout << "The result is: " << result << std::endl; // 输出:The result is: 31
std::cout << "x is now: " << x << std::endl; // 输出:x is now: 11
return 0;
}
在这个例子中,increment_and_sum
是一个lambda表达式,它按引用捕获x
并按值捕获y
。在函数体内,我们递增了x
的值,并返回了x
和y
的和。注意,由于x
是按引用捕获的,所以lambda表达式对x
的修改会反映到原始变量上。