lambda表达式

Lambda 表达式是 C++11 引入的一种匿名函数特性,它允许你在需要函数的地方内联定义函数,而无需单独命名。

auto 函数名=[捕获列表](参数列表)->返回类型{
    //函数体
};
  1. 捕获列表 (capture)
    定义 lambda 如何访问外部变量
  • [] 不捕获任何变量
  • [=] 按值捕获所有外部变量
  • [&] 按引用捕获所有外部变量
  • [x, &y] 混合捕获(x 按值,y 按引用)
  • [this] 捕获当前类的 this 指针
  1. 参数列表 (parameters)
    和普通函数参数列表类似,可以省略(当没有参数时)
  2. 返回类型 (return_type)
    可以省略,编译器会自动推导
  3. 函数体
    包含要执行的代码

示例

基本 lambda

auto greet = []() { 
    cout << "Hello, World!"; 
};
greet();  // 输出: Hello, World!

带参数的 lambda

auto add = [](int a, int b) { 
    return a + b; 
};
cout << add(3, 4);  // 输出: 7

捕获外部变量

int x = 10;
auto increment = [x](int n) { 
    return x + n;
};
cout << increment(5);  // 输出: 15

修改捕获的变量

int counter = 0;
auto increment = [&counter]() { 
    counter++;
};
increment();
cout << counter;  // 输出: 1

高级特性

可变 lambda\ (mutable)But\ C++23

允许修改按值捕获的变量:

int x = 10;
auto foo = [x]() mutable {
    x += 5;  // 可以修改,但只影响 lambda 内部的副本
    return x;
};
foo();  // 返回 15
std::cout << x;  // 输出 10(外部 x 不变)

指定返回类型

auto divide = [](int a, int b) -> double {
    if(b == 0) return 0.0;
    return static_cast<double>(a)/b;
};

泛型 lambda\ But\ C++14

auto generic_add = [](auto a, auto b) { 
    return a + b; 
};
std::cout << generic_add(3, 4.5);  // 输出: 7.5

立即调用的 lambda\ (IIFE)

const auto result = [](int x) {
    return x * x;
}(5);  // 立即调用,result = 25
The\ End

原帖

3 个赞

注:
此特性(自 C++23 起)
image

1 个赞

@谢锦瑞
你人真好。

@Erin 这不能给解决方案

e但是这似乎是学术话题

em
布吉岛

不行吧,这不是求助帖,而且没有给楼主实质性的帮助

@Erin @施忆晨

是的