[C++] 什么是lambda表达式?它与普通函数有何不同?

2 阅读3分钟

在 C++ 中,lambda 表达式是一种匿名函数,可以用来创建临时函数对象。它允许我们在需要函数的地方定义函数,而不必显式地编写函数的名称。Lambda 表达式的语法形式如下:

[capture clause](parameters) -> return_type {
    // 函数体
}
  • capture clause:捕获列表,用于捕获外部变量,可以是按值捕获或按引用捕获。
  • parameters:函数参数列表,与普通函数的参数列表类似。
  • return_type:返回类型,指定 lambda 表达式的返回类型。
  • {}:函数体,包含 lambda 表达式的实际操作。

Lambda 表达式与普通函数的不同之处包括:

  1. 匿名性:Lambda 表达式是匿名的,不需要为其指定函数名,可以直接在需要的地方定义和使用。
  2. 捕获外部变量:Lambda 表达式可以捕获其所在作用域内的变量,包括按值捕获和按引用捕获
  3. 简洁性:Lambda 表达式通常比普通函数更简洁、更方便,特别是在需要定义简单函数的地方。
  4. 内联使用:Lambda 表达式通常在需要的地方内联使用,不需要额外的函数定义和声明。

捕获列表(capture clause)

在 C++ 的 lambda 表达式中,捕获列表(capture clause)用于指定 lambda 表达式中可以访问的外部变量。捕获列表允许 lambda 表达式在其函数体中使用在其定义范围之外的变量。捕获列表有以下几种形式:

  1. 按值捕获:通过值拷贝的方式捕获外部变量,外部变量的值在 lambda 表达式创建时被拷贝,lambda 表达式中使用的是拷贝后的值。按值捕获使用 [=] 表示,示例代码如下:
int x = 10;
auto lambda = [=]() {
    // 可以访问 x 的拷贝
    std::cout << x << std::endl;
};
  1. 按引用捕获:通过引用的方式捕获外部变量,外部变量在 lambda 表达式中以引用的方式使用,可以修改外部变量的值。按引用捕获使用 [&] 表示,示例代码如下:
int y = 20;
auto lambda = [&]() {
    // 可以访问并修改 y 的值
    y = 30;
    std::cout << y << std::endl;
};
  1. 按值捕获特定变量:可以选择性地按值捕获特定的外部变量,示例代码如下:
int z = 50;
auto lambda = [z]() {
    // 只能访问 z 的拷贝,不能修改 z 的值
    std::cout << z << std::endl;
};
  1. 按引用捕获特定变量:可以选择性地按引用捕获特定的外部变量,示例代码如下:
int w = 40;
auto lambda = [&w]() {
    // 可以访问并修改 w 的值
    w = 60;
    std::cout << w << std::endl;
};

捕获列表允许您控制 lambda 表达式如何访问外部变量,以便在 lambda 函数体内部访问和修改这些变量。根据捕获列表的不同形式,您可以选择性地按值或按引用捕获所有外部变量或特定外部变量。