一、lambda優點
- 減少命名煩惱
- 支持泛型編程
二、lambda什麼時候用?
- 簡單、使用頻率低的操作
lambda可以理解爲一個未命名的內聯函數,內聯函數要求其相對簡單;若需要頻繁調用定義函數更佳 - 解除算法特定謂詞限制
一些算法要求可調用對象必須爲特定謂詞(find_if
接受單一參數謂詞),使用捕獲列表可以降低謂詞元數
三、lambda的定義
定義一個lambda等效於定義一個新的未命名類類型,向一個函數傳遞lambda也就是傳遞一個lambda對象,使用auto定義變量等效於定義了對應的對象。格式如下:
[capture_list](parameter_list)->return type{fucntion body}
-
capture_list:捕獲列表。捕獲局部非靜態變量,捕獲的對象可以是引用或者是值,在函數體內可以對其進行改變,不過值捕獲默認禁止修改,需要加上關鍵字
mutable
,引用捕獲取決於對象本身是否爲const
。捕獲變量可以由編譯器推斷得到,=
默認推斷爲值捕獲,&
爲引用捕獲,稱之爲隱式捕獲;直接指出捕獲變量名稱爲值捕獲。當顯式捕獲和隱式捕獲混合使用時,第一個必須爲=
或&
說明默認捕獲方式。 -
parameter_list:參數列表;
-
return type:返回類型;
-
function boby:函數體。如果含有
return
外語句,推斷爲void
,爲了正確定義返回類型,必須使用尾置返回類型。
四、lambda調用
使用調用運算符()
五、lambda引用捕獲和值捕獲的捕獲時刻
引用捕獲在調用時進行捕獲,而值捕獲則是在定義之時進行捕獲。
int main()
{
int a=22;
auto f=[a](){cout<<a<<endl; };//值捕獲,網頁快照,內容不變。
auto ff=[&a]{cout<<a<<endl;};//引用捕獲,訪問地址,內容會調整。
f();
a++;
ff();
f();
}
輸出結果分別是:22 23 22
[1]《C++ primer 5th》
[2] 你爲什麼要用lambda表達式?理解它你就知道了