Lambda表达式语法

时间:2021-10-25 19:11:01

例子

把斐波那契数列的前9个数存入vector容器。并输出。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
	const int elementNum=9;
	vector<int> vecInt(elementNum,1);

	int x=1,y=1;
	generate_n(vecInt.begin()+2,elementNum-2,[=] ()mutable throw() ->int{
		int n=x+y;
		x=y;
		y=n;
		return n;
	});
	for_each(vecInt.begin(),vecInt.end(),[](int n){cout<<n<<" ";});
	cout<<endl;
	cout<<x<<" "<<y<<endl;
}
Lambda表达式语法

例子分析

Lambda表达式语法
 图中各标识的意义:
1:[]声明了一个lambda表达式,=为捕获语法
2:参数列表
3:可变规范
4:异常规范
5:返回值
6:Lambda表达式主体

捕获子句

[] 声明了Lambda表达式,表示一个Lambda表达式开始了。=和&是两种捕获符号。
[=,&x]
[&x,y]
[&,y]
 是一样的。即[]中如果第一个参数为‘=’,则除非特殊指定的变量,都采用拷贝方式。如果第一个参数为‘&’,则除非特殊指定的变量,都采用引用方式。
如果[]中没有参数,则Lambda不能访问外部变量。

参数列表

与函数列表类似,但是:
不能有默认参数,不能有变长参数,不能有未命名参数。
参数列表是可选的,如果不写参数列表,即不写‘()’,那么必须也不能写可变规范,异常规范和返回值。

可变规范

以‘=’捕获的都是拷贝的副本,是只读的,如果想修改捕获的变量的副本,则必须加上mutable,但是对副本的修改不会影响原来的变量。

异常规范

不多说了。

返回值

返回值语法->Type。例如->int,->double。
如果Lambda主体只包含一条语句,即return语句,或者没有返回值,那么可以不用写返回值语句。

Lambda表达式主体

Lambda可以访问的变量:
1:从封闭范围内捕获的变量
2:参数
3:本地变量(表达式主体中定义的变量)
4:类的成员变量(Lambda定义在类中),表现为引用
5:具有静态存储时间的变量(全局变量等),此时表现为引用