news 2026/6/3 2:56:08

C++11 Lambda表达式入门与原理解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++11 Lambda表达式入门与原理解析

Lambda 表达式通常被称为匿名函数,

但从底层实现来看,

它本质上是编译器生成的匿名仿函数对象。

一.基础语法

[capture](parameter)->return_type

{

body

};

这是基本格式

[](int a,int b)->int

{

return a+b;

};

其作用与下面代码相同

int Add(int a,int b)

{

return a+b;

}

区别在于lambda是匿名的。

需要注意的是,很多代码中不会写->type,这是因为大多数情况计算机可以自己推出来。而只有在以下情况下,才需要自己去写

auto func = [](int x) -> double

{

if(x > 0)

return 1;

else

return 3.14;

};

这种形式无法确定返回值类型,因此需要写上。

二.使用方法

Lambda 表达式生成的是一个匿名类型,

由于我们无法写出这个类型名,

因此通常使用 auto 接收 Lambda 对象。

auto add =

[](int a,int b)

{

return a+b;

};

由于这种匿名函数的展开是一种class类,而我们本身不知道这个类的名字,类似于 __Lambda123形式。所有需要auto,将这个任务交给计算机即可。

最终直接调用add即可。

cout<<add(10,20);

三.Lambda底层原理

Lambda 不是函数,而是一个由编译器生成的匿名类对象(仿函数对象)。

首先我们看一下仿函数

class Add

{

public:

int operator()(int a, int b)

{

return a + b;

}

};

Add add;

cout << add(10, 20);

看起来像函数调用。
实际上是:
add.operator()(10,20);

从这里大家就可以发现,这种调用方法不正是lambda的调用方法吗,没错。

在计算机内部当你写了如下代码时

auto add =
[](int a, int b)
{
return a + b;
};

计算机会将其转换为我们熟悉的形态。

class __Lambda

{

public:

int operator()(int a,int b)

{

return a+b;

}

};

其实就是一个仿函数,区别只是仿函数是你自己写类,Lambda是编译器帮你写类。

四.捕获列表(Lambda 灵魂)

捕获的本质:
编译器将捕获的变量变成 Lambda 对象的数据成员。

因为 Lambda 内部看不到外部变量。

所以值捕获非常重要。

int a = 10;

auto func =
[a]
{
cout<<a;
};

传进去的是拷贝版,不方便改值,自然而然的就有了引用捕获

int a = 10;

auto func =
[&a]
{
cout<<a;
};

全部值捕获

[a,b,c]太麻烦。

直接用[=]表示全部值捕获。

例如:

int a=10;

int b=20;

auto func =

[=]

{

cout<<a+b;

};

全部引用捕获

[&]

混合捕获

[=,&a]意思是其他变量值捕获以及a引用捕获

五.mutable(可变的)

原本情况下是不可以更改副本的。

int a = 10;

auto func =
[a]
{
a++;
};//这是会报错的

这是因为默认是operator() const

只需加上mutable就可以了

[a]() mutable
{
a++;
}

而这只是对副本的修改。

六.经典应用

vector<int> v =

{

5,3,7,1,9

};

sort(v.begin(),v.end(),

[](int a,int b)

{

return a>b;

});//降序排列

auto it =
find_if(
v.begin(),
v.end(),
[](int x)
{
return x > 5;
}
);//查找

thread t(
[]
{
cout << "Hello Lambda";
});

t.join();//线程

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 2:53:09

学术答辩PPT高效制作方案:百考通AI实战使用测评

摘要&#xff1a;毕业答辩、课题汇报、开题展示是高校学生必备的学术考核环节&#xff0c;而PPT制作耗时、排版不规范、内容精简困难是多数学生的共性痛点。相较于通用AI PPT工具适配性差、学术模板稀缺的问题&#xff0c;百考通AI深耕校园学术场景&#xff0c;针对性优化答辩P…

作者头像 李华
网站建设 2026/6/3 2:49:23

League-Toolkit全解析:英雄联盟客户端的终极智能工具箱

League-Toolkit全解析&#xff1a;英雄联盟客户端的终极智能工具箱 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的游戏生态中&am…

作者头像 李华
网站建设 2026/6/3 2:49:20

通关NandGame组合电路后,我悟了:原来CPU设计可以这么‘偷懒’(附门延迟优化心得)

从NandGame通关看组合电路设计的艺术&#xff1a;门延迟优化与思维跃迁第一次在NandGame中完成组合电路设计时&#xff0c;那种从底层搭建出完整计算单元的成就感难以言喻。但真正让我着迷的&#xff0c;是后续优化过程中发现的那些精妙设计技巧——原来同样的功能可以用更少的…

作者头像 李华