C++11新特性- lambda表達(dá)式詳解
可以認(rèn)為lambda表達(dá)式取得信息有兩種方式,或者說(shuō)兩個(gè)時(shí)機(jī):一個(gè)是參數(shù)列表,其內(nèi)容是在表達(dá)式被調(diào)用時(shí)決定;另一個(gè)捕獲列表,其內(nèi)容是在是表達(dá)式被創(chuàng)建的時(shí)候決定,本文討論捕獲列表。
值捕獲
先看如下代碼:
int?factor?=?2; auto?multiply?=?[factor](int?value) ????????????????{return?factor?*?value;}; factor?=?4; cout?<<?multiply(2)?<<?endl;
代碼中首先為factor賦值2,創(chuàng)建lambda表達(dá)式以后,再次賦值4。由于lambda表達(dá)式的捕獲是在該表達(dá)式創(chuàng)建是進(jìn)行的,而第二次賦值在lambda表達(dá)式創(chuàng)建之后,所以muliply(2)的執(zhí)行結(jié)果為4。
引用捕獲
還是這段代碼,只要在捕獲列表中變量的前面多了一個(gè)&,就變成了引用捕獲。
int?factor?=?2; auto?multiply?=?[&factor](int?value) ????????????????{return?factor?*?value;}; factor?=?4; cout?<<?multiply(2)?<<?endl;
捕獲的時(shí)機(jī)并沒(méi)有變化,只是捕獲的是factor的引用而不是factor的值,所以定義lambda之后,對(duì)factor再次賦值4依然會(huì)影響multiply(2)的結(jié)果。此時(shí)的輸出為8。
隱式捕獲
前面例子中使用捕獲列表時(shí),具體指定了變量名,屬于顯式捕獲。另外還有隱式捕獲,由lambda表達(dá)式推斷需要捕獲的變量。具體方法是:
當(dāng)需要隱式值捕獲時(shí),使用[=];
當(dāng)需要隱式引用捕獲時(shí),使用[&];
在上面例子中使用隱式捕獲以后,結(jié)果不會(huì)發(fā)生變化。
作者觀點(diǎn)
lambda表達(dá)式是個(gè)好東西,但也要理解才行。