C 11 lambda表示式小結

2022-07-22 06:09:11 字數 2575 閱讀 2997

目錄problems

lambda表示式是乙個匿名內聯函式,可以定義別的函式體中,其形式如下:

[capture list](parameter list)->return type
從中可以看到,lambda只能使用尾置返回型別

尾置返回型別放在引數列表後邊以->開頭,然後再原來放返回型別的地方放乙個auto。

lambda不可缺少的部分是捕獲列表capture list和函式體funtion body,其他都可以忽略不寫。

return type會根據funtion body中的內容來推斷,如果只含有乙個return 語句,型別就從其推斷,否則就是void。如果不是上述情況,就需要自己定義乙個返回型別,防止推斷為void和期望返回的型別不符合的問題。

parameter list需要實參和形參互相匹配,且lambda不能有預設引數,所以兩者屬於也要相等。

capture list是lambda所在函式中定義的區域性變數,lambda可以對其進行捕獲然後進行使用,捕獲過程也分為值和引用,使用時看是否需要對捕獲的變數進行修改和所捕獲的變數是否支援這種操作。

值捕獲需要變數能被拷貝,比如io流是不能被拷貝,這就只能用引用。

有時可能需要返回乙個lambda,當返回時,此lambda就不能用到引用,否則就會出現函式將返回乙個區域性變數的引用,這是不合法的。

引用捕獲需要物件存在。

lambda在捕獲的時候就對變數進行了複製(值捕獲時),所以希望能藉此修改外部變數,應該時用引用。但是如果只需要就地對捕獲的變數進行修改並且不想對外部修改的話,就可以在值捕獲時在引數列表之後指明mutable關鍵字。

顯示就是直接寫出區域性變數,隱式就是不在capture list中寫出名字,只寫捕獲方式,其中 = (代表值捕獲), & (代表引用捕獲),讓編譯器自己推斷要使用那些變數。

比如:

[ = ](string s1)  //假設length為乙個區域性變數,則此時採用值捕獲。
兩者也可以混搭,這有乙個要求:capture list中第乙個元素必須為隱式捕獲,並且顯示和隱式捕獲的方式必須不同。

比如:

[ = ,&os](string &s) //假設tmp為區域性變數,採用了值捕獲,則只能用顯示捕獲
列表含義

空捕獲列表

[n1,&n2,n3,&n4...]

以逗號為分隔的捕獲列表,顯示捕獲

[&]隱式捕獲,lambda中使用的變數全部採用引用捕獲

[=]隱式捕獲,lambda中使用的變數全部採用值捕獲

[&,n1,n2]

混和捕獲,n1和n2值捕獲,其餘為引用捕獲

[=,&n1,&n2]

混和捕獲,n1和n2引用捕獲,其餘為值捕獲

examples

#includeusing namespace std;

void elimdups(vector& words)

//countwords返回乙個計數值,表示有多少個元素長度大於等於sz

int countwords(vector& words, vector::size_type sz) );//長度排序,長度相同也維持字典序

//for (auto i : words)cout << i << " "; cout << endl;

auto it = count_if(words.begin(), words.end(), [sz](const string& s) );

return it;

}int main(void)

//for (auto i : words)cout << i << " "; cout << endl;

int cnt = countwords(words, 5);//計算有多少個元素長度大於等於5

cout << cnt << endl;

//the quick red fox jumps over the slow red turtle

auto f=[&]()->bool ;

cout << f() << endl;//呼叫lambda改變變數

cout << cnt << endl;

cout << f() << endl;//再呼叫lambda不再改變變數

cout << cnt << endl;

return 0;

}

input:

the quick red fox jumps over the slow red turtle

output:31

010

lambda在定義時,編譯器就會生成乙個對應的匿名類,該類會包含所有**獲的變數作為資料成員初始化,並且該類的operator()預設時const,這就導致無法修改類中的成員函式,加上mutable,即可轉換為非const,就可以就地修改了。

C 11 lambda表示式 詳解

如下圖,lambda表示式由下面幾個部分構成 c 11 的 lambda 表示式規範如下 mutable 修飾符說明 lambda 表示式體內的 可以修改 獲的變數,並且可以訪問 獲物件的 non const 方法。exception 說明 lambda 表示式是否丟擲異常 noexcept 以及丟...

C 11 lambda 表示式解析

中括號中 from 下面是各種變數擷取的選項 小括號中,就是函式引數 lambda表示式可以作為其它函式引數 1 標準格式 有箭頭 就要顯示寫明返回值型別 auto pfunc1 this void pfunc1 2 簡化格式 void 型別返回值 沒有箭頭 會預設檢測返回值型別 auto pfun...

C 11 Lambda表示式簡介

lambda簡介 capture列表 mutable說明 c 11中的lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda表示式一般都是從方括號開始,然後結束於花括號 主要包括五個部分 常見幾種lambda表示式形式 表示式 capture params mutable...