Lambda 表达式
Lambda 表达式是 C++11 引入的一种方便的编写匿名函数对象的方法。Lambda 表达式允许你在需要一个函数对象的地方编写一个内联的、未命名的函数。Lambda 表达式的基本语法如下:
[ capture_clause ] ( parameters ) -> return_type {
function_body
}
其中各个部分的含义如下:
capture_clause
:捕获列表,定义了 lambda 表达式可以从封闭作用域中捕获哪些变量以及如何捕获(通过值或引用)。parameters
:参数列表,与普通函数的参数列表类似。return_type
:返回类型,可以省略,编译器可以自动推导返回类型。function_body
:函数体,包含 lambda 表达式的代码块。
下面是一个 lambda 表达式的例子:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
int factor = 2;
std::vector<int> nums = {1, 2, 3, 4, 5};
// 使用 lambda 表达式来修改 vector 中的每个元素
std::for_each(nums.begin(), nums.end(), [factor](int &n) {
n *= factor; // 每个元素乘以 factor
});
// 使用 lambda 表达式来打印 vector 中的每个元素
std::for_each(nums.begin(), nums.end(), [](int n) { std::cout << n << ' '; });
std::cout << std::endl;
return 0;
}
立即调用 Lambda 函数的例子
你可以创建一个 lambda 表达式,并且立即调用它。下面是一个立即调用 lambda 表达式的例子:
#include <iostream>
int main() {
// 定义并立即调用 lambda 表达式
int result = [](int a, int b) -> int {
return a + b;
}(5, 3); // 传递参数 5 和 3
std::cout << "The result is: " << result << std::endl; // 输出结果 8
return 0;
}
Lambda 表达式的相关特性
-
捕获列表:Lambda 表达式可以捕获外部作用域中的变量,这可以通过值(
[=]
)或引用([&]
)来实现。你也可以混合使用,或者捕获特定的变量。 -
可变 Lambda:如果想在 lambda 表达式内修改通过值捕获的变量,需要在参数列表后添加
mutable
关键字。 -
泛型 Lambda:C++14 引入了泛型 lambda,允许使用
auto
关键字来指定参数类型,使得 lambda 表达式能够接受不同类型的参数。 -
返回类型推导:在 C++11 中,如果 lambda 表达式的函数体只包含一个返回语句,或者是一个构造函数调用,那么返回类型可以被自动推导。在 C++14 中,返回类型推导得到了改进,可以推导所有类型的返回值。
-
捕获 this 指针:Lambda 表达式可以捕获类成员函数中的
this
指针,以便访问类的成员变量和成员函数。 -
指定异常:Lambda 表达式可以指定异常规范,例如
noexcept
,来告知编译器该 lambda 表达式是否会抛出异常。