lambda是C++11特性之一,可以方便构造匿名函数。当代码有很多小程序并且使用次数只有一次时候,可以把他们重构成lambda表达式。
C++11 的 lambda 表达式规范如下:
(1)[ capture ] ( params ) mutable exception attribute -> ret { body }
(2)[ capture ] ( params ) -> ret { body }
(3)[ capture ] ( params ) { body }
(4)[ capture ] { body }
1 mutable 修饰符说明 lambda 表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获对象的 non-const 方法。
2 exception 说明 lambda 表达式是否抛出异常(noexcept),以及抛出何种异常,类似于void f() throw(X, Y)。
3 attribute 用来声明属性。
(1)是最全的形式。
(2)不能更改捕获列表中的值
(3)省略return的话,就根据函数体去看。lambda会根据函数体中的代码推断返回类型,如果函数体只是一个return 语句,南宋么返回类型从return 语句看,如果没有return语句,则返回为void型.
capture 指定了在 lambda 表达式的代码内可使用的外部变量的列表,比如:
形式 | 含义 |
---|---|
[a] | a变量以值的方式被捕获 |
[&b] | b以引用的方式被捕获 |
[this] | 以值的方式捕获 this 指针。 |
[&] | 以引用的方式捕获所有的外部自动变量。 |
[=] | 以值的方式捕获所有的外部自动变量。 |
[] | 不捕获外部的任何变量。 |
没有捕获,自然不能使用这些外部变量.
简单的例子:
lambda_test.cpp
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
auto a_fun = [] () { cout << "Hello world"<< endl; };
a_fun();
return EXIT_SUCCESS;
}
lambda(2).cpp
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
auto a_fun = [](int r){return 3.14*r*r ; };
cout << "a_fun(6) = "<< a_fun(6) << endl;
return EXIT_SUCCESS;
}