lambda表達(dá)式

lambda表達(dá)式是C++11引入的新特性执解,用于聲明一個(gè)函數(shù)帝洪,因?yàn)椴恍枰獙?duì)這個(gè)函數(shù)指定函數(shù)名款青,故lambda表達(dá)式聲明的是匿名函數(shù)。lambda來(lái)源于函數(shù)式編程的概念霍狰,也是現(xiàn)代編程語(yǔ)言的一個(gè)特點(diǎn)抡草。


lambda表達(dá)式具有如下優(yōu)點(diǎn):

(1)聲明式編程風(fēng)格:匿名定義函數(shù),不需要額外命名函數(shù)蔗坯,可以更直接地寫程序康震。

(2)在需要的時(shí)間和地點(diǎn)實(shí)現(xiàn)功能閉包,使編寫程序更加靈活宾濒。因?yàn)槠洳恍枰~外命名函數(shù)腿短,避免了代碼膨脹和功能分散,使得程序更加簡(jiǎn)潔。


lambda表達(dá)式的語(yǔ)法如下:

[caputrue](params)opt -> ret { body; };

(1)caputrue是捕獲列表橘忱。指明了lambda表達(dá)式能訪問(wèn)的外部變量(lambda表達(dá)式函數(shù)體之外的變量)赴魁,以及如何訪問(wèn)這些變量。具體情況如下:

[] 不捕獲任何外部變量

[&] 按引用捕獲钝诚,即捕獲外部作用域中所有變量颖御,并作為引用在函數(shù)體中使用。

[=] 按值捕獲凝颇,即捕獲外部作用域中所有變量潘拱,并作為值副本在函數(shù)體中使用。

[=拧略,&a] 按值捕獲外部作用域中所有變量芦岂,并按引用捕獲a變量。

[b] 按值捕獲b變量垫蛆,同時(shí)不捕獲其他變量禽最。

[this] 應(yīng)用于類中。捕獲當(dāng)前類中的this指針月褥,讓lambda表達(dá)式擁有和當(dāng)前類成員函數(shù)同樣的訪問(wèn)權(quán)限弛随,從而可以在lambda中使用當(dāng)前類的成員函數(shù)和成員變量。如果已經(jīng)在捕獲列表中使用了&或者=宁赤,那么就默認(rèn)添加了該選項(xiàng)舀透。

(2)params是參數(shù)列表。表示傳給lambda表達(dá)式的參數(shù)序列决左,選填愕够。

(3)opt是函數(shù)選項(xiàng)》鹈停可以填mutable惑芭,exception,attribute(選填一個(gè)或者多個(gè))继找。

mutable:說(shuō)明lambda表達(dá)式體內(nèi)的代碼可以修改被捕獲的變量遂跟,如果被捕獲的變量是一個(gè)對(duì)象則可以調(diào)用該對(duì)象的non-const函數(shù)。

exception:說(shuō)明lambda表達(dá)式是否拋出異常婴渡。

attribute:用來(lái)聲明函數(shù)屬性幻锁。

(4)ret是返回類型,選填边臼。

(5)body是函數(shù)體哄尔。


下面以在類中聲明lambda表達(dá)式為例:

class A{

public:

int a = 0;

void fun(int x, int y){

auto a1 = []{ return a; };? ? //error,沒(méi)有捕獲外部變量

auto a2 = [=] { return a + x + y; };? ? //ok

auto a3 = [&] { return a + x + y; };? ? //ok

auto a4 = [this] { return a; };? ? //ok

auto a5 = [this]{return a + x + y; };? /*error柠并,因?yàn)閤岭接,y不是類成員變量富拗,而且沒(méi)有捕獲x,y*/

auto a6 = [this, x, y]{ return a + x + y; };? ? //ok

auto a7 = [this]{ return a ++; };? ? //ok

}


注意事項(xiàng):

1鸣戴、lambda表達(dá)式的延遲調(diào)用啃沪。lambda表達(dá)式按值捕獲外部變量時(shí),在捕獲的瞬間葵擎,外部變量的值就被復(fù)制了谅阿,之后該外部變量值的改變不會(huì)對(duì)之前捕獲到的值有影響。如果希望lambda表達(dá)式在調(diào)用時(shí)即時(shí)訪問(wèn)外部變量酬滤,應(yīng)該使用引用方式捕獲签餐。

int a = 0;

auto func1 = [=] { return a; };

a ++;

std::cout << func1() << std::endl;? ? //輸出0

int b = 0;

auto func2 = [&b]{ return b; };

b ++;

std::cout << func2() << std::endl;? ? //輸出1

2、按值捕獲外部變量時(shí)盯串,在lambda表達(dá)式中修改它們的副本并不會(huì)影響外部的值氯檐,但我們?nèi)匀粺o(wú)法修改這些副本。如果想修改這些副本体捏,需要顯示聲明lambda表達(dá)式為mutable冠摄。lambda表達(dá)式定義的是仿函數(shù)閉包。lambda表達(dá)式捕獲到的任何外部變量几缭,最終均會(huì)變?yōu)殚]包類型的成員變量河泳。按照C++11標(biāo)準(zhǔn),lambda表達(dá)式的operator()默認(rèn)是const的年栓,一個(gè)const成員函數(shù)是無(wú)法修改成員變量的值的拆挥。而mutable就取消了operator()的const。

注:被mutable修飾的lambda表達(dá)式就算沒(méi)有參數(shù)也要顯示寫明參數(shù)列表某抓。

int a = 0;

auto func1 = [=] { return a++; };? ? //error

auto func2 = [=] () mutable { return a++; };? ? //ok

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纸兔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子否副,更是在濱河造成了極大的恐慌汉矿,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件备禀,死亡現(xiàn)場(chǎng)離奇詭異洲拇,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)曲尸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門呻待,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人队腐,你說(shuō)我怎么就攤上這事∽喔荩” “怎么了柴淘?”我有些...
    開封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵迫淹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我为严,道長(zhǎng)敛熬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任第股,我火速辦了婚禮应民,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘夕吻。我一直安慰自己诲锹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開白布涉馅。 她就那樣靜靜地躺著归园,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稚矿。 梳的紋絲不亂的頭發(fā)上庸诱,一...
    開封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音晤揣,去河邊找鬼桥爽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛昧识,可吹牛的內(nèi)容都是我干的钠四。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼滞诺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼形导!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起习霹,我...
    開封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤朵耕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后淋叶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阎曹,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年煞檩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了处嫌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斟湃,死狀恐怖熏迹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凝赛,我是刑警寧澤注暗,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布坛缕,位于F島的核電站,受9級(jí)特大地震影響捆昏,放射性物質(zhì)發(fā)生泄漏赚楚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一骗卜、第九天 我趴在偏房一處隱蔽的房頂上張望宠页。 院中可真熱鬧,春花似錦寇仓、人聲如沸举户。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)敛摘。三九已至,卻和暖如春乳愉,著一層夾襖步出監(jiān)牢的瞬間兄淫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工蔓姚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捕虽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓坡脐,卻偏偏與公主長(zhǎng)得像泄私,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子备闲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

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