C++11中引入了lambda,lambda指的是定义一个内联(inline)函数,并且这个内联函数可以被用作一个参数或局部变量,这类似于函数对象(function object),由于lambda是一种内联的,因此效率上比函数对象高一些。
以下lambda用法:“{}”中为函数体的实现,“()”中放的是函数参数,“[]”中放的是非静态的外部变量,也就是说在lambda函数体内可以用到lambda函数外的局部变量,并且若加上“&”意为传引用语义,都不加则为传值语义。
另外,若加上mutable关键字表示"[]"中的变量能否在函数体中被改变;加上throwSpec关键字表示该函数能否抛异常;加上“->retType”表示函数返回值类型,不加则表示函数无返回。以上3个关键字都是opt可选项,可写可不写。
以下是对于lambda语法的测试,注意最后一个框中要返回值,必须加上“->retType”。
以下是编译器对lambda写法的内部实现,可见与函数对象的实现很类似。
lambda虽然内部是函数对象,但其不存在默认构造函数和赋值操作,因此以下在使用过程中由于要用到cmp的构造函数,因此编译器会报错,这种情况下更应当使用函数对象。
lambda和函数对象在STL中使用的比较,可见lambda可将简短的实现直接写在调用处,代码更紧凑,同时它是inline的,效率上稍高一些。