C++11新標(biāo)準(zhǔn)引入lambda表達(dá)式,主要部分如下:
創(chuàng)新互聯(lián)建站主營(yíng)綏陽(yáng)網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app軟件開(kāi)發(fā),綏陽(yáng)h5微信小程序定制開(kāi)發(fā)搭建,綏陽(yáng)網(wǎng)站營(yíng)銷(xiāo)推廣歡迎綏陽(yáng)等地區(qū)企業(yè)咨詢
[捕獲列表](參數(shù))->type{函數(shù)體},使用尾置返回類(lèi)型,其中可以忽略參數(shù)與返回類(lèi)型,但要保存捕獲列表與函數(shù)體,使用調(diào)用運(yùn)算符調(diào)用,可在(參數(shù))后添加mutable限定符使值捕獲的數(shù)據(jù)可在函數(shù)體里修改。
使用lambda表達(dá)式時(shí),編譯器會(huì)產(chǎn)生未命名類(lèi)的未命名對(duì)象,且有一個(gè)調(diào)用運(yùn)算符成員函數(shù),實(shí)際使用時(shí)會(huì)調(diào)用該調(diào)用運(yùn)算符成員函數(shù)。該未命名類(lèi)不包含默認(rèn)構(gòu)造函數(shù)、賦值運(yùn)算符、默認(rèn)析構(gòu)函數(shù),而是否包含默認(rèn)的拷貝、移動(dòng)構(gòu)造函數(shù)與捕獲數(shù)據(jù)成員類(lèi)型有關(guān)。
[捕獲列表]
表示外部捕獲的數(shù)據(jù),會(huì)將外部數(shù)據(jù)通過(guò)構(gòu)造函數(shù)傳入未命名類(lèi)里,可使用值傳遞與引用傳遞,值傳遞:auto Lambda = [intVal](){cout << intVal << endl;}; Lambda();,默認(rèn)intVal為const類(lèi)型,且該調(diào)用運(yùn)算符是const成員函數(shù),不可修改intVal,如果需要修改則在(參數(shù))后添加限定符mutable:
auto Lambda = [intVal]()mutable{cout << ++intVal << endl;}; Lambda();,此時(shí)intVal可修改,且調(diào)用運(yùn)算符成員函數(shù)是非const函數(shù)。值傳遞不會(huì)改變外部數(shù)據(jù)。
引用傳遞:auto Lambda = [&intVal](){cout << ++intVal << endl;}; Lambda();,引用傳遞是否被修改取決于intVal是否為const類(lèi)型,如果被修改則會(huì)同時(shí)修改外部數(shù)據(jù)。
可使用隱式的值、引用傳遞,其捕獲的數(shù)據(jù)可通過(guò)編譯器在函數(shù)體的推導(dǎo)得出:auto Lambda = [=,&intVal](){cout << (data+intVal) << endl;}; Lambda();,其中data為隱式值傳遞;auto Lambda = [&](){cout << (data-intVal) << endl; func();}; Lambda();,其中data,intVal都是隱式引用傳遞,同時(shí)調(diào)用了func函數(shù)。如果使用隱式傳遞則要求=、&要在捕獲列表的首位置,同時(shí)之后的顯式捕獲不可為隱式捕獲的傳遞方式。
注:如果是在類(lèi)內(nèi)使用并調(diào)用類(lèi)內(nèi)數(shù)據(jù),則可以使用[=]、[&]、[this]方式隱式或顯式捕獲this并使用類(lèi)內(nèi)成員,如果是類(lèi)靜態(tài)成員可以直接使用而不用捕獲。
(參數(shù))
接收外部參數(shù),與普通調(diào)用類(lèi)似:auto Lambda = [](int val){cout << ++val << endl;}; Lambda(1);。匿名函數(shù)是可調(diào)用對(duì)象,可作為比較函數(shù)傳入:
// main.cpp #include <iostream> #include <algorithm> using std::cout; using std::ends; using std::sort; using std::string; using std::begin; using std::end; int main() { string arr[] = {"123","12345","1233","1233345"}; sort(begin(arr),end(arr),[] (const string &s1,const string &s2) { return s1.size() > s2.size(); // 按照字符串的大小逆序排序 } ); for (const auto &each : arr) { cout << each << ends; } return 0; }
->type為尾置返回類(lèi)型,可省略,如果有多個(gè)return且返回類(lèi)型不一致,則需要指明返回類(lèi)型:
// main.cpp #include <iostream> using std::cout; using std::ends; int main() { auto Lambda = [](int choice)->char { if (choice == 0) { return 0x41; // 'A' } else { return '1'; } }; cout << Lambda(0) << ends; return 0; }
{函數(shù)體},這個(gè)應(yīng)該很熟悉
以上是對(duì)lambda表達(dá)式的介紹,如有錯(cuò)誤望交流指正。
網(wǎng)頁(yè)名稱(chēng):C++lambda表達(dá)式
標(biāo)題路徑:http://muchs.cn/article6/ihesig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、網(wǎng)站設(shè)計(jì)、域名注冊(cè)、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)