[]{}是一个类型;[]{}()就可以调用,相当于临时对象;多数会写成最后一种形式,赋予一个名称auto I=[]{};I();
lambda语法
[]导入符号,mutuable是否可以被改写参数,throwSpec丢出异常,->retType表示返回类型;紫框可写可不写,但是如果写一个就必须要写();{}是函数本体;()里放函数参数;[]取用外部的变量;
(2)左侧相当于右侧建立一个仿函数类,重载();
- 绿色框还没做事情,只是一个定义,真正调用执行是f();注意输出为012,因为在定义时,相当于右侧的仿函数类,有自己的一个数据id,创建的时候看到了上面的id=0;自己的id=0;++id变得是自己的id数据,不会影响外界的id;
- Lambda的类型是一个不知名的仿函数;
- 因为[id]而不是[&id],因此外界id不会变;
- mutable表示id可以改变,没有Mutable的话,就不能改变id;与仿函数还是又一点点不完全等价;
lambda用法比较
- 第一个如上,第二个[&id]传入引用,外界会影响,操作也会影响外界;第三个,没有mutable就不允许改变[]中参数id,编译器会报错;
- Lambda是一个仿函数,也可以在函数主题中定义变量,返回数值
lambda举例
Lambda与decltype
(1)decltype用作获取Lmabda的类型;
(2)上面一段话的意思就是,lambda就一个无名的仿函数,但是每个都是独一无二的,因此,如果要声明这个类型就使用template或者auto,如果需要类型就使用decltype,例如当你需要使用lambda作为一个hash function或者排序准则传给不定序容器,具体例子代码如图所示;
(3)左侧是set<>coll(cmp);构造函数如箭头所指,
(4)下面一段话:在使用decltype获取lambda类型作为容器类型时,需要同时传入lambda作为构造函数参数,不然容器set会选择调用lambda的默认构造函数和默认赋值操作,但是lambda并没有默认构造,编译器就会报错;因此需要set<>coll(cmp);传入lambda的cmp;
lambda与functor仿函数的对比
左侧lambda就相当于一个inline内联函数,效率会比右侧仿函数更高;但是这点效率略显微不足道;