Lambda表達式語法

例子

把斐波那契數列的前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;
}

例子分析


 圖中各標識的意義:
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:具有靜態存儲時間的變量(全局變量等),此時表現爲引用


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章