lambda 表达式是一种匿名函数,即没有函数名的函数;该匿名函数是由数学中的λ演算而来的。
通常情况下,lambda函数的语法定义为:
[capture] (parameters) mutable ->return-type {statement}
[capture] :捕捉列表。捕捉列表总是作为lambda的开始,即出现于lambda的开始处。它是lambda的引出符(即开始标志)。编译器可以根据该“标志”来作出判断出该函数是否为lambda函数。同时“捕捉列表”能够捕捉上下文中的变量以作为lambda函数使用。
(parameters):参数列表。和C/C++中的普通函数参数意义一样。该部分是可选的,意味着如果我们不需要进行参数传递时,可以连同括号“()”一起省略掉。
mutable:该关键字为一个修饰符。在默认的情况下,lambda函数总是返回一个const,而当我们在参数列表后面注明了“mutable”关键字之后,则可以取消其常量性质。若在lambda中使用了mutable修饰符,则“参数列表”是不可省略掉的(即使是参数为空)。
->return-type: 函数的返回值类型。和C/C++中的普通函数返回值类型的性质一样。主要目的是用来追踪lambda函数(有返回值情况下)的返回类型。若lambda函数不需要返回值,则可以直接将这部分省略掉。
{statement}:函数体。在该函数体中,除了可以使用参数列表中的变量外,还可以使用所有捕获到的变量(即[capture] 中的变量)。
极端情况下最简单的lambda函数就是 [ ]{ };
c++11里面lambda是内联函数(inline),对于简单重复的小型操作,没必要写一个函数去调用,可以直接用lambda,此外,在c++11里lambda与仿函数基本等价,语法糖!
解决了c类语言函数内部不能继续声明定义函数的特性问题,因为lambda可以声明定义在函数内部。
int main()
{
int a = 1;
int b = 2;
// 定义一个lambda函数
auto sum = [a,b]{
return a + b;
};
std::cout << sum() << std::endl; // 3
return 0;
}