C++ lambda使用方法和捕獲形式

一、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表達式?理解它你就知道了

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