C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。
声明Lambda表达式
Lambda表达式完整的声明格式如下:
[capture list] (params list) mutable exception-> return type { function body }
各项具体含义如下
- capture list:捕获外部变量列表
- params list:形参列表
- mutable指示符:用来说用是否可以修改捕获的变量
- exception:异常设定
- return type:返回类型
- function body:函数体
Lambda表达式实际上就是提供一下类似匿名函数的特性,而匿名函数是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用的。
所谓捕获列表,其实可以理解为参数的一种类型,lambda表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。
#include <functional> //std::function的头文件
#include <iostream>
int foo(int para)
{
return para;
}
int main()
{
std::function<int(int)> func = foo;
int important = 100;
//lambda表达式
std::function<int(int)> func2 = [&](int value) -> int {
return 1+value+important;
};
std::cout << func(10)<<std::endl;
std::cout << func2(10)<<std::endl;
}
输出结果:
10
111
func(10)的结果很容易理解,但是func2(10)呢?
//lambda表达式
int important = 100;
std::function<int(int)> func2 = [&](int value) -> int {
return 1+value+important;
};
捕获列表中的&相当于直接将important传入lambda表达式中,value作为形参传入,对于func2(10)来说,value=10,所以,func2(10)的结果为111。