C++11 lambda表達式

1. lambda表達式的定義形式

lambda表達式是C++11引入的一個重要特性之一密强,來源于函數(shù)式編程的概念帅掘。一個lambda表達式就是一個可調(diào)用的代碼單元壁顶,lambda表達式的定義形式如下:

[captrue list] (parameter list) -> return type or exception { function body}
  • captrue list 捕獲列表际乘;
  • parameter list 參數(shù)列表副砍;
  • "-> return type" 尾置返回類型衔肢,或者異常;
  • function body 函數(shù)體豁翎;
image.png

當(dāng)編寫一個lambda表達式之后角骤,編譯器將該表達式翻譯成一個未命名類的未命名對象,在lambda表達式產(chǎn)生的未命名類中含有一個重載的函數(shù)調(diào)用運算符,如:

// lambda表達式
auto func = [](const string &a, const string &b){
    return a.size() > b.size();
};
// 等價于
class NoNameClass{
public:
    bool operator()(const string &a, const string &b) const{
        return a.size() > b.size();
    }
};

2. lambda表達式使用注意細節(jié)

  • 與普通函數(shù)不同邦尊,lambda表達式的參數(shù)列表不能有默認(rèn)值背桐;
  • lambda可以省略參數(shù)列表和返回類型(默認(rèn)返回void),但是必須包含捕獲列表和函數(shù)體蝉揍;
  • 默認(rèn)情況下链峭,如果一個lambda中包含一個return之外的任何語句,編譯器將假定此lambda的返回void又沾;
  • lambda若有返回類型弊仪,只能通過尾置返回的方法指定返回類型;
// 只包含一個return語句的lambda表達式杖刷,返回類型會自動推導(dǎo)
auto f = []{ return 42; };

// 包含了除retrun以外的其他語句励饵,必須通過尾置的方式指定返回類型
auto f = [](int i) -> int // 尾置返回值類型
{
    if (i<0) return -i; else return i;
};
  • 捕獲列表只用于局部非static變量,lambda表達式可以直接使用局部static變量和它所在函數(shù)之外聲明的名字滑燃;

3. 捕獲列表

值捕獲

lambda表達式通過值捕獲時役听,捕獲的值會被拷貝到產(chǎn)生的無名類的對象中,無名類中應(yīng)包含與之對應(yīng)的數(shù)據(jù)成員不瓶。
例如:查找一個單詞列表中禾嫉,第一個長度大于10的單詞

// lambda表達式
size_t szvalue = 10;
find_if(words.begin(), words.end(), 
           [sz](const string &a){returna.size() > szvalue ;});

// 等價于
class NoNameClass{
public:
    NoNameClass(size_t n): sz(n){} //增加了一個構(gòu)造函數(shù)
    bool operator()(const string &a) const{
        return a.size() > sz;
    }
private:
    size_t sz; // 增加了對應(yīng)的成員變量
};
find_if(words.begin(), words.end(), NoNameClass(szvalue ));

因此下面的例子就不難理解了,

void func1()
{
    size_t v1 = 41;
    auto f = [v1]{return v1;};
    v1 = 0;
    cout << f() << endl; //輸出42蚊丐,因為此時相當(dāng)于打印的是無名對象中的成員變量;
}

注意:lambda表達式產(chǎn)生的類中不含默認(rèn)的構(gòu)造函數(shù)艳吠、賦值運算符麦备、以及默認(rèn)的析構(gòu)函數(shù)。

引用捕獲

當(dāng)lambda表達式通過引用捕獲變量時昭娩,編譯器直接使用該引用凛篙,而不會在lambda產(chǎn)生的無名類中將其保存為成員變量,因此程序需要負(fù)責(zé)確保lambda表達式執(zhí)行時栏渺,所引用的對象確實存在呛梆。

void func2()
{
    size_t v1 = 41;
    auto f = [&v1]{return v1;};
    v1 = 0;
    cout << f() << endl; //輸出0
}

一般來說,應(yīng)該盡量減少捕獲的數(shù)據(jù)磕诊,來避免潛在的捕獲導(dǎo)致的問題填物。而且,如果可能的話霎终,應(yīng)該盡量避免捕獲引用或者指針滞磺。

隱式捕獲

在捕獲列表中寫一個&或者=,編譯器會自動的推斷使用哪種捕獲方式莱褒,&使用引用的方式捕獲击困,=則表示使用值的方式捕獲。
如果希望對一部分變量采用值捕獲广凸,對其他變量采用引用捕獲阅茶,可以混合使用隱式捕獲和顯示捕獲蛛枚。


image.png

參考

  • C++ Primer (第五版)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脸哀,隨后出現(xiàn)的幾起案子蹦浦,更是在濱河造成了極大的恐慌,老刑警劉巖企蹭,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件白筹,死亡現(xiàn)場離奇詭異,居然都是意外死亡谅摄,警方通過查閱死者的電腦和手機徒河,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來送漠,“玉大人顽照,你說我怎么就攤上這事∶龉眩” “怎么了代兵?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長爷狈。 經(jīng)常有香客問我植影,道長,這世上最難降的妖魔是什么涎永? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任思币,我火速辦了婚禮,結(jié)果婚禮上羡微,老公的妹妹穿的比我還像新娘谷饿。我一直安慰自己,他們只是感情好妈倔,可當(dāng)我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布博投。 她就那樣靜靜地躺著,像睡著了一般盯蝴。 火紅的嫁衣襯著肌膚如雪毅哗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天结洼,我揣著相機與錄音黎做,去河邊找鬼。 笑死松忍,一個胖子當(dāng)著我的面吹牛蒸殿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼宏所,長吁一口氣:“原來是場噩夢啊……” “哼酥艳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爬骤,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤充石,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后霞玄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骤铃,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年坷剧,在試婚紗的時候發(fā)現(xiàn)自己被綠了惰爬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡惫企,死狀恐怖撕瞧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狞尔,我是刑警寧澤丛版,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站偏序,受9級特大地震影響页畦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜研儒,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一寇漫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殉摔,春花似錦、人聲如沸记焊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遍膜。三九已至碗硬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓢颅,已是汗流浹背恩尾。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挽懦,地道東北人翰意。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冀偶。 傳聞我的和親對象是個殘疾皇子醒第,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容