Featured image of post Lambda

Lambda

Lambda

概念

Lambda函数,亦称为Lambda表达式、匿名函数等,是一种函数对象,Lambda函数可以让函数像普通变量一样进行赋值、传递、函数返回等操作。C++中的Lambda函数经常用来解决如下问题:

  1. 使得程序更加简洁,尤其对于一次性使用的函数。
  2. 有些库函数要求传递的参数是一个函数,但是你又不想写一个函数出来
  3. 使得函数可以自由流动,就像变量一样,这给函数式编程模式奠定了语法基础。

语法

定义

1
[capture list](params list)mutable exception  return type{functionbody}
  • captruelist: 外部变量列表

  • params list: 形参列表

  • mutable: 是否可以修改外部变量。

    • 默认情况下,Lambda函数总是一个const函数,mutable可以取消其常量性。
    • 在使用mutable时,形参列表不可省略
  • exception: 异常设定

  • return type: 返回类型

    • 可以不需要声明返回值,此时返回类型相当于使用decltyp根据返回值推断得到
  • function body: 函数体

1
2
3
4
int a = 10;
auto f = [a]() mutable ->int{
    a = 100; // 允许修改
};

mutable 用于取消 Lambda 表达式的常量性,使得按值捕获的变量可以在函数体内被修改,但修改的仅为变量副本,不会影响外部原变量

1
2
3
4
int a = 10;
auto f = [a]() noexcept  ->int{
   return 10;	//不会抛出任何异常
};

noexcept 是 C++ 异常说明符,声明这个 Lambda 不会抛出任何异常

throw(类型)可以抛出指定类型异常

1
2
[]() noexcept { }
[]() throw(int) { throw 10; }
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <iostream>
using namespace std;

int main(int argc,char const *argv[])
{
    int a=1;
    int b=2;
    
    int sum = [a,b]()->int{return a+b;}();
    cout << "sum: "<<sum <<endl;
    
    retuen 0;
}
  • [a,b]从外部捕获变量a,b的变量,默认它们在Lambda函数内部是只读

  • ()圆括号内是Lambda函数的形参列表,此处为空,但不可省略。

  • ->int 是Lambda函数的返回值类型,可以省略。

  • {}内部就是Lambda函数的具体代码实现

  • 最右边的圆括号 () 是对Lambda函数调用的符号,不是Lamdba函数本身

1
2
3
4
5
6
7
8
// 将匿名的Lambda函数,赋值给一个名叫f的函数对象
auto f = ->int{return a+b;};

// 方式1:Lambda立即调用(定义后直接加()执行)
int sum = ->int{return a+b;}();

// 方式2:通过函数对象f调用(等价于方式1)
int sum = f();
1
[&a, b]()->int{a=100; return a+b;}();

&a 代表以引用模式捕获变量a,此时可以在Lambda函数体内修改变量a

捕获作用域内所有变量

1
2
3
4
5
//以传值模式,只读,捕获外部所有变量
[=]()->int{...}

//以引用模式,读写,捕获外部所有变量
[&]()->int{...}
最后更新于 2026-04-08 22:52