概念
lambda表达式实际上是一个匿名类的成员函数,该类由编译器为lambda创建,该函数被隐式地定义为内联。因此,调用lambda表达式相当于直接调用它的operator()函数,这个函数可以被编译器内联优化(建议)。
例如快速排序算法,STL允许用户自定义比较方式,在C 11之前,通常使用仿函数实现。但是代码一旦很长,使用之处和仿函数实现的地方相隔甚远,而且如果仿函数的命名不规范,很容易造成使用上的困难。
用法
C 11的lambda表达式是一种允许内联函数的特性,它可以用于不需要重用和命名的代码片段。lambda表达式的一般形式是:
代码语言:javascript复制[capture](parameters) mutable -> return_type { function_body }
接下来我们介绍一下不同部分:
[captureclause]:捕捉列表。该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。
代码语言:javascript复制 - []:表示不捕获任何外部变量
- [=]:以传值的方式捕获外部变量
- [&]:以传引用的方式捕获外部变量
- [this]:捕获外部的this指针
- [=,&a]:以传值的方式捕获外部变量,但是以传引用的方式捕获变量a
- [a,b]:以值传递的方式捕获外部变量a和b
- [a,&b]:a以值传递的方式捕获,b以引用的方式捕获
(parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。
mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。
->return-type:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可以省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
{statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。
示例
代码语言:javascript复制int main()
{
auto func = []()->void {cout << "hello world"<<endl; };
func();
}
如下:
其实,lambdo的本质就是重载了()