C++中的Lambda表達(dá)式

技術(shù)交流QQ群:1027579432综芥,歡迎你的加入!

1.Lambda函數(shù)與表達(dá)式

  • C++11提供了對(duì)匿名函數(shù)的支持,稱為L(zhǎng)ambda函數(shù)(也叫Lambda表達(dá)式)沦泌。Lambda表達(dá)式把函數(shù)看作對(duì)象溉痢。Lambda表達(dá)式可以像對(duì)象一樣使用,比如可以將它們賦給變量和作為參數(shù)傳遞包雀,還可以像函數(shù)一樣對(duì)其求值宿崭。Lambda 表達(dá)式本質(zhì)上與函數(shù)聲明非常類似,Lambda表達(dá)式具體形式如下:
    [capture](parameters) mutable ->return-type{statement}
例如:
    [](int a, int b) -> int { return a + b; };
  • 參數(shù)介紹:
    • [capture]:捕捉列表。捕捉列表總是出現(xiàn)在lambda表達(dá)式的開(kāi)始處才写。事實(shí)上葡兑,[]是lambda引出符。編譯器根據(jù)該引出符判斷接下來(lái)的代碼是否是lambda函數(shù)赞草。捕捉列表能夠捕捉上下文中的變量供lambda函數(shù)使用讹堤。
    • (parameters):參數(shù)列表。與普通函數(shù)的參數(shù)列表一致厨疙。如果不需要參數(shù)傳遞洲守,則可以連同括號(hào)()一起省略。
    • mutable:mutable修飾符沾凄。默認(rèn)情況下梗醇,lambda函數(shù)總是一個(gè)const函數(shù),mutable可以取消其常量性搭独。在使用該修飾符時(shí)婴削,參數(shù)列表不可省略(即使參數(shù)為空)。
    • ->return_type:返回類型牙肝。用追蹤返回類型形式聲明函數(shù)的返回類型唉俗。出于方便,不需要返回值的時(shí)候也可以連同符號(hào)->一起省略配椭。此外虫溜,在返回類型明確的情況下,也可以省略該部分股缸,讓編譯器對(duì)返回類型進(jìn)行推導(dǎo)衡楞。
    • {statement}:函數(shù)體。內(nèi)容與普通函數(shù)一樣敦姻,不過(guò)除了可以使用參數(shù)之外瘾境,還可以使用所有捕獲的變量。在lambda函數(shù)的定義式中镰惦,參數(shù)列表和返回類型都是可選部分迷守,而捕捉列表和函數(shù)體都可能為空,C++中最簡(jiǎn)單的lambda函數(shù)只需要聲明為:[]{};
   // 定義一個(gè)簡(jiǎn)單的lambda表達(dá)式
    auto basicLamda = [] {cout << "hello world!" << endl; };
    basicLamda();  // 調(diào)用
    // 如果需要參數(shù)旺入,那么就要像函數(shù)那樣兑凿,放在圓括號(hào)里面凯力,如果有返回值,返回類型要放在->后面礼华,即拖尾返回類型
    // 當(dāng)然你也可以忽略返回類型咐鹤,lambda會(huì)幫你自動(dòng)推斷出返回類型
    auto add = [](int a, int b) -> int {return a + b; };
    int result = add(4, 5);
    cout << "result = " << result << endl;
    // 自動(dòng)推斷出返回類型
    auto multiply = [](int a, int b) {return a * b; };
    int result1 = multiply(5, 6);
    cout << "result1 = " << result1 << endl;
  • 在Lambda表達(dá)式內(nèi)可以訪問(wèn)當(dāng)前作用域的變量,這是Lambda表達(dá)式的閉包(Closure)行為圣絮。C++變量傳遞有傳值和傳引用的區(qū)別祈惶。可以通過(guò)前面的[]來(lái)指定:
    • [] // 沒(méi)有定義任何變量晨雳。使用未定義變量會(huì)引發(fā)錯(cuò)誤
    • [x, &y] // x以傳值方式傳入(默認(rèn))行瑞,y以引用方式傳入
    • [&] // 任何被使用到的外部變量都隱式地以引用方式加以引用
    • [=] // 任何被使用到的外部變量都隱式地以傳值方式加以引用
    • [&, x] // x顯式地以傳值方式加以引用。其余變量以引用方式加以引用
    • [=, &z] // z顯式地以引用方式加以引用餐禁。其余變量以傳值方式加以引用
  • 對(duì)于[=]或[&]的形式血久,lambda表達(dá)式可以直接使用this指針。但是帮非,對(duì)于[]的形式氧吐,如果要使用this指針,必須顯式傳入:[this]() { this->someFunc(); }();
        #include "iostream"
    
        using namespace std;
    
    
    
        class Test{
        public:
            void hello(){
                cout << "test hello!\n";
            };
            void lambda(){
                auto fun = [this]{ // 捕獲了 this 指針
                this->hello(); 
                }; // 這里 this 調(diào)用的就是 class Test 的對(duì)象了
                fun();
            }
        };
    
    
        int main(){
            // 定義一個(gè)簡(jiǎn)單的lambda表達(dá)式
            auto basicLamda = [] {cout << "hello world!" << endl; };
            basicLamda();  // 調(diào)用
            // 如果需要參數(shù)末盔,那么就要像函數(shù)那樣筑舅,放在圓括號(hào)里面,如果有返回值陨舱,返回類型要放在->后面翠拣,即拖尾返回類型
            // 當(dāng)然你也可以忽略返回類型,lambda會(huì)幫你自動(dòng)推斷出返回類型
            auto add = [](int a, int b) -> int {return a + b; };
            int result = add(4, 5);
            cout << "result = " << result << endl;
            // 自動(dòng)推斷出返回類型
            auto multiply = [](int a, int b) {return a * b; };
            int result1 = multiply(5, 6);
            cout << "result1 = " << result1 << endl;
            // 1游盲、什么也不捕獲误墓,或者是故意不用 Lambda 函數(shù)外部的變量
            int  i = 1024;
            // auto f = []{cout << "i = " << i << endl; }; 報(bào)錯(cuò)!應(yīng)該使用了lambda函數(shù)外部的變量
            auto f = [=] { cout << "i = " << i << endl; };  // 使用傳值的方式使用外lambda函數(shù)外部的變量i
            f();  // 調(diào)用函數(shù)
            // 2、引用捕捉
            int i1 = 666;
            cout << "變量i1的引用: " << &i1 << endl;
            auto f1 = [&] { cout << "變量i1的引用: " << &i1 << endl; };
            f1();
            // 3益缎、復(fù)制并引用捕獲
            int i2 = 777, j2 = 888;
            cout << "i2 = " << i2 << endl;
            cout << "j2 = " << j2 << endl;
            auto f2 = [=, &i2] { cout << "i2 = " << &i2 << " ,j2 = " << &j2 << endl; };  // 默認(rèn)拷貝外部所有變量谜慌,但引用變量i2
            f2();
            // 4、指定引用或復(fù)制
            int i3 = 444, j3 = 555;
            cout << "外部變量i3 = " << i3 << " i3的地址是: " << &i3 << endl;
            auto f3 = [i3] { cout << "內(nèi)部變量i3 = " << i3 << " i3的地址是: " << &i3 << endl; };
            f3();
            // 5莺奔、捕獲this指針
            Test t;
            t.lambda();
            return 0;
        }
    
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欣范,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子令哟,更是在濱河造成了極大的恐慌恼琼,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屏富,死亡現(xiàn)場(chǎng)離奇詭異晴竞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)役听,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門颓鲜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人典予,你說(shuō)我怎么就攤上這事甜滨。” “怎么了瘤袖?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵衣摩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我捂敌,道長(zhǎng)艾扮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任占婉,我火速辦了婚禮泡嘴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逆济。我一直安慰自己酌予,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布奖慌。 她就那樣靜靜地躺著抛虫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪简僧。 梳的紋絲不亂的頭發(fā)上建椰,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音岛马,去河邊找鬼棉姐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛛枚,可吹牛的內(nèi)容都是我干的谅海。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蹦浦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扭吁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起盲镶,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤侥袜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后溉贿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枫吧,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年宇色,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了九杂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颁湖。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖例隆,靈堂內(nèi)的尸體忽然破棺而出甥捺,到底是詐尸還是另有隱情,我是刑警寧澤镀层,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布镰禾,位于F島的核電站,受9級(jí)特大地震影響唱逢,放射性物質(zhì)發(fā)生泄漏吴侦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一坞古、第九天 我趴在偏房一處隱蔽的房頂上張望备韧。 院中可真熱鬧,春花似錦痪枫、人聲如沸盯蝴。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捧挺。三九已至,卻和暖如春尿瞭,著一層夾襖步出監(jiān)牢的瞬間闽烙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工声搁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留黑竞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓疏旨,卻偏偏與公主長(zhǎng)得像很魂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子檐涝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344