C++ Lambda表达式

风陵南·2025-02-10 17:30·7 次阅读

C++ Lambda表达式

Lambda表达式

Lambda表达式是C++ 11 引入的一种匿名函数的方式,它允许你在需要函数的地方内联地定义函数,而无需单独命名函数,常用于简化代码、实现回调函数或配合 STL 算法使用。

基本语法结构#

Lambda表达式的基本语法如下:

Copy
[捕获列表](参数列表) -> 返回类型{
// 函数体
// 可以使用捕获列表中的变量
return expression; //可选的返回语句
}
  • 捕获列表(Capture List) :定义Lambda如何访问外部变量。
  • 参数列表(Parameter List):与普通函数的参数列表类似。
  • 返回类型(Return Type):可省略,由编译器自动推导。
  • 函数体(Body):具体的实现逻辑

捕获列表(Capture List)#

捕获列表决定了Lambda如何访问外部作用域的变量:

  • []:不捕获任何外部变量。
  • [=]:按值捕获所有外部变量(副本)。
  • [&]:按引用捕获所有外部变量。
  • [var]:按值捕获特定变量var
  • [&var]:按引用捕获特定变量var
  • 混合捕获:例如[=, &x]表示按值捕获所有变量,但x按引用捕获。

示例:

Copy
int a = 1, b = 2;
auto lambda = [a, &b]() {
// a 是值捕获(只读),b 是引用捕获(可修改)
b = a + b; // 合法
// a = 3; // 错误:按值捕获的变量默认不可修改(除非用 mutable)
};

参数列表与返回类型#

  • 参数列表:与普通函数已知,支持默认参数(C++14起)。
  • 返回类型:可显式指定(-> type),或由return语句自动推导。

示例:

Copy
// 自动推导返回类型(int)
auto add = [](int x, int y) { return x + y; };
// 显式指定返回类型(double)
auto divide = [](int x, int y) -> double {
if (y == 0) return 0.0;
return static_cast<double>(x) / y;
};

mutable关键字#

默认情况下,按值捕获的变量在Lambda内是只读的。若需修改副本,需使用mutable关键字:

Copy
int count = 0;
auto counter = [count]() mutable {
count++; // 修改的是 Lambda 内部的副本
return count;
};

Lambda的应用场景#

(1)STL排序算法中的谓词#

Copy
std::vector<int> nums = {3, 1, 4, 1, 5};
// 使用 Lambda 排序(降序)
std::sort(nums.begin(), nums.end(), [](int a, int b) {
return a > b;
});

(2)异步回调#

Copy
#include <thread>
std::thread t([&]() {
// 在后台线程中执行的操作
});
t.join();

(3)简化函数对象#

Copy
auto print = [](const std::string& msg) {
std::cout << msg << std::endl;
};
print("Hello, Lambda!");

注意事项#

  • 生命周期问题:按引用捕获的变量可能在Lambda执行时已销毁,导致未定义行为。
  • 性能:Lambda是编译器生成的匿名类对象,小规模使用性能接近普通函数。
  • 泛型Lambda(C++14+):支持auto参数:
Copy
auto generic = [](auto x, auto y) { return x + y; };
posted @   风陵南  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示
目录