lamda表达式
创始人
2024-05-17 00:21:44

lamda表达式可以看作是一个匿名函数。编译器在编译的时候,会将lamda表达式处理成一个仿函数类,类名是类名是不重复的随机名称(因为一个作用域中可能存在多个仿函数),返回该仿函数的对象。

lamda既然可以看作是一个匿名函数,那就至少具备除函数名以外的两部分:返回值、形参列表、函数体

lamda表达式的书写格式

[capture-list](parameters)mutable->return-type{ statement }
/*[](const int x, const int y)mutable->int{return x + y;}
*/

目录

一、lamda表达式各部分说明 

1、capture-list(必要部分)

2、parameters(可选部分)

3、mutable(可选部分)

4、->return-type(可选部分)

5、 statement(必要部分)

二、lamda表达式的底层处理


一、lamda表达式各部分说明 

1、capture-list(必要部分)

(1) 捕获方式

capture-list表示捕获列表,lamda表达式可以通过捕获列表来获取上下文的变量,以供lamda表达式使用,无需通过形参列表传递变量。

捕获列表有两种方式来捕获变量:值传递、引用传递

捕获方式解释
[var]以值传递的方式捕获变量 var,如[ a ],捕获上下文中的变量a
[=]以值传递的方式捕获父作用域中的所有变量(包括this)
[&var]以引用传递的方式捕获变量var
[&]以引用传递的方式捕获父作用域中的所有变量(包括this)
[this]以值传递的方式捕获当前的this指针

(2) 注意事项

不能以相同的方式捕捉同一个变量。比如[=, a], = 表示以传值的方式捕捉所有的变量(包括变量a),a表示以传值的方式捕捉变量a,这个时候变量a以传值的方式被捕捉了两次

[=, a](){}        // 错误,重复捕获

不能捕捉父作用域之外的变量(包括全局变量)

int a = 10;
auto obj1 = []{};    // 注意,此时lamda表达式没有父作用域,捕获列表必须为空int main()
{auto obj2 = [a]{};    // 错误,不可以捕获全局变量
}

 lamda表达式不能相互赋值。lamda表达式底层是被处理成一个类,不同的lamda表达式相当于不同的类(即便是类型相同也不行),不同的类之间不能相互赋值。

int main() {auto obj1 = [] {};auto obj2 = [] {};obj2 = obj1;        // 错误,obj1和obj2底层被处理成不同的类,他们的类名不可能重复
}

2、parameters(可选部分)

parameters表示调用lamda表达式时,要传递给lamda表达式的值。如果无需传递参数,该部分可以省略。

[]mutable->int{ return 0; };

3、mutable(可选部分)

默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表parameters不可省略(即使参数为空)

[]()->int{ return 0; };

4、->return-type(可选部分)

return-type表示lamda表达式的返回值类型。无返回值时,可以省略;有返回值时,也可以省略,此时交由编译器推导。

[](){ return 0; };

5、 statement(必要部分)

statement表示函数体,在函数体中,可以使用形参列表,也可以使用所有捕获到的变量,函数体中的语句可以有多条。

int main()
{int a = 10;auto obj = [&a](const int x){int c = x - a;return c;};return 0;
}

二、lamda表达式的底层处理

以下面这个lamda表达式为例

int main() {auto obj1 = [] {};   obj1();cout << typeid(obj1).name() << endl;
}

由此可见,lamda表达式实际上是被处理成一个类,类名是 lamda_ ,这样保证了每个lamda表达式的唯一性。lamda表达式的返回值就是该类的对象。

我们通过反汇编来看一下lamda表达式的调用过程,我们会发现,类lamda_ 中重载了operator(),这样就可以使用对象来调用lamda表达式了。

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
少数民族的传统节日有哪些 55... 公务员考试常识判断模块考查范围广泛,需要大家在日常多加积累,本文小编总结了中国少数民族的传统节日,希...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
mb什么意思 MB和Mb 相信很多人都还不太清楚手机流量的统计单位,经常听说谁谁流量包月5个G。其实G、GB、KB、M和MB数...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...