lambda
lambdas
类似于一种 inline function,能被当作是一种参数或是一种局部对象。
看到中括号开头的那就是 lambda 啦~~~
[] {
std::cout << "hello lambda!" << std::endl;
};
[] {
std::cout << "hello lambda!" << std::endl;
} (); //prints "hello lambda!"
//or pass it to objects to get called:
auto l = [] {
std::cout << "hello lambda!" << std::endl;
};
···
l(); //prints "hello lambda!"
[] 是 lambda introducer,看到这个中括号就表明是个 lambda 表达式。
[···] (···) mutable throwSpec -> retType {···}
int id = 0;
auto f = [id] () mutable { // 此处的 mutable 表示 [] 中的内容即 id 可变; 如果不加 mutable 关键字,id 是不能 ++ 的!!
std::cout << "id:" << id << std::endl;
++id; //OK
}
id = 42;
f();
f();
f();
std::cout << id << std::endl;
得到结果:
id: 0
id: 1
id: 2
42
怎么理解呢?????
lambda 类型可以理解成是一种匿名函数对象:
class Function {
private:
int id; //copy of outside id
public:
void operator()() {
std::cout << "id:" << id << std::endl;
++id; //OK
}
};
Function f;
这样就不难理解上述 lambda 对象 f 的行为了。在构造 lambda 表达式之前 id = 0, 那么此时构造 lambda 表达式,相当于构造了一个 Function 类,类中的 member data 就是通过 [] 传进来的值。此时 f.id = 0,所以之后程序执行到 id = 42,并不会影响到 f 中的 member data!!!
当 pass by reference 时又会发生什么呢?
int id = 0;
auto f = [&id] (int param) {
std::cout << "id:" << id << std::endl;
++id; ++param;//OK
}
id = 42;
f(7);
f(7);
f(7);
std::cout << id << std::endl;
得到结果:
id: 42
id: 43
id: 44
45
可以说这个结果是在意料之中的!
看一个编译器为 lambda 产生的代码:
int tobefound = 5;
auto l = [tobefound] (int val) {return val == tobefound;};
// 编译器对 lambda 表达式解释成如下:
//=======================================================
class UnNamedLocalFunction
{
int localVar;
public:
UnNamedLocalFunction(int var) : localVal(var) {}
bool operator()(int val)
{ return val == tobefound; }
}
UnNamedLocalFunction l(tobefound);
//=======================================================
bool b1 = l(5);
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Vue3封装支持Base64导出的电子签名组件
· 万字长文详解Text-to-SQL
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)