Lambda表达式是c++11的新特性,它容许程序员在函数内部建立一个匿名函数,对于一些小型的功能模块,能够使用lambda表达式来实现。不少其余语言已经有了lambda表达式,好比objective-c中block就相似。c++
Lambda表达式的声明方式:程序员
例如:objective-c
auto fadd = [](int a, int b) { return a + b; };
Fadd就是一个匿名函数,后面是它的实现,auto是自动类型,也是c++11新加入的特性,auto能够自动判断类型。[]
表示开始定义lambda表达式,他能够带参数,()
里面的是函数的参数, {}
体内的是函数体。这里函数的返回值隐含了,也能够指明函数的返回值。例如函数
显示指明返回值,采用:this
auto fadd = [](int a, int b)->int { return a + b; };
总结:lambda表达式的申明形势为指针
[captures] (params) -> ret {Statments;}
c++11
考虑这样一种状况,加入你的lambda表达式须要使用外部变量,那该怎么办呢?lambda表达式提供了变量截取的功能。code
例如:作用域
int val = 1; auto fadd = [&](int a, int b)->int { return val = a + b + val; }; cout << fadd(2, 3) <<endl; cout << "val = " << val<< endl;
val是外部变量,若是在fadd中须要访问val,必须在[]中指明截取方式,这里用的&表示截取外部做用域中全部变量,并做为引用在函数体中使用。匿名函数
Lambda表达式中有多种变量截取方式。
下面是各类变量截取的选项:
[]
不截取任何变量[&}
截取外部做用域中全部变量,并做为引用在函数体中使用[=]
截取外部做用域中全部变量,并拷贝一份在函数体中使用[=, &foo]
截取外部做用域中全部变量,并拷贝一份在函数体中使用,可是对foo变量使用引用[bar]
截取bar变量而且拷贝一份在函数体重使用,同时不截取其余变量[this]
截取当前类中的this指针。若是已经使用了&
或者=
就默认添加此选项。