關(guān)于lamda 表達(dá)式以及mutable 參數(shù)

C++11引入了Lambda表達(dá)式。Lambda表達(dá)式的引入,方便了簡(jiǎn)短函數(shù)的定義,為常用的一次性函數(shù)的定義和使用提供了很大的便利。

Lambda表達(dá)式實(shí)際上是一種匿名函數(shù)定義,常用來(lái)定義簡(jiǎn)單和不重復(fù)使用的函數(shù)。其可使用的外部變量、定義方式等都與常規(guī)函數(shù)有所不同。

語(yǔ)法結(jié)構(gòu)# Lambda表達(dá)式的完整定義結(jié)構(gòu)如下:

auto f = [函數(shù)對(duì)象參數(shù)](函數(shù)參數(shù)列表) mutable throw(類(lèi)型)->返回值類(lèi)型 {函數(shù)語(yǔ)句};

Lambda表達(dá)式的定義結(jié)構(gòu)分為六個(gè)部分:

函數(shù)對(duì)象參數(shù)部分,Lambda表達(dá)式的引入部分,用于初始化Lambda表達(dá)式,其中[]中可以填入一些標(biāo)識(shí)來(lái)指示Lambda表達(dá)式如何捕獲可以訪(fǎng)問(wèn)的變量。Lambda表達(dá)式可以捕獲的變量只限于在Lambda表達(dá)式定義位置之前出現(xiàn)的變量。標(biāo)識(shí)的放置有以下幾種方式:
空白表示不使用任何參數(shù),僅可使用形參列表中的參數(shù)。
=(等號(hào)),表示使用的變量以值傳遞的方式捕獲,可以直接使用this指針,不再需要顯式列舉this。
&(與號(hào)),表示使用的變量以引用傳遞的方式捕獲,可以直接使用this指針,不在需要顯示列舉this。
this,表示Lambda表達(dá)式可以使用所在類(lèi)中的成員變量。
變量名,表示在Lambda表達(dá)式中,該變量使用以值傳遞的方式捕獲。
&變量名,表示在Lambda表達(dá)式中,該變量使用以引用傳遞的方式捕獲。
組合方式,以逗號(hào)分隔各個(gè)捕獲標(biāo)識(shí),特殊標(biāo)識(shí)的變量按照特殊方式捕獲,其余按照默認(rèn)的標(biāo)識(shí)進(jìn)行捕獲,例如[=, &a, &b]表示a與b兩個(gè)變量按引用捕獲,其余變量按值捕獲。
函數(shù)參數(shù)列表與常規(guī)函數(shù)定義中的形參列表相同。
mutable關(guān)鍵字,表示可以修改按值傳入的變量的副本(不是值本身),類(lèi)似于不帶const關(guān)鍵字的形參。使用mutable關(guān)鍵字后對(duì)按值傳入的變量進(jìn)行的修改,不會(huì)將改變傳遞到Lambda表達(dá)式之外。
throw(類(lèi)型)表達(dá)式,表示Lambda表達(dá)式可以?huà)伋鲋付?lèi)型的異常。
->返回值類(lèi)型,指示Lambda表達(dá)式定義的匿名函數(shù)的返回值類(lèi)型。
函數(shù)語(yǔ)句,跟常規(guī)函數(shù)的函數(shù)語(yǔ)句相同,如果指定了函數(shù)的返回值類(lèi)型,函數(shù)實(shí)現(xiàn)語(yǔ)句中一定需要return來(lái)返回相應(yīng)的類(lèi)型的值。

基本示例#

基本Lambda表達(dá)式的使用##

lang: cpp
int x = 10;
int y = 20;
int z;
z = [=](int a, int b) -> int { return (a + x) * (b + y); }(1, 2);
cout << z << endl;

Result: 242

函數(shù)指針的使用##

lang: cpp
typedef int (*Func)(int&, int&);
Func f = [](int& a, int& b) -> int { return a + b; };

關(guān)于mutable##

lang: cpp
int x = 1;
int y = 1;
int z;
cout << "x1: " << x << "/t y1: " << y << endl;
z = [=]() mutable -> int
{
    int n = x + y;
    ++x;
    ++y;
    cout << "x2: " << x << "/t y2: " << y << endl;
    return n;
}();
cout << "x3: " << x << "/t y3: " << y << endl;
cout << "z: " << z << endl;

輸出的結(jié)果為:

lang: cpp
x1: 1 y1: 1
x2: 2 y2: 2
x3: 1 y3: 1
z: 2

mutable關(guān)鍵字只能在Lambda表達(dá)式定義體之內(nèi)改變x和y的值,但是這種改變并不能傳遞到定義體之外。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容