lambda函數(shù)的語(yǔ)法如下:
[capture list] (parameter list) -> return type { function body }
[] capture list
捕獲列表,定義了lambda函數(shù)如何引用上下文中既有變量。分傳值和引用兩種方式漫谷,默認(rèn)為傳值桃移。
Example | Comment |
---|---|
[] | 沒(méi)有定義任何變量屋匕。使用未定義變量會(huì)引發(fā)錯(cuò)誤。 |
[x, &y] | x以傳值方式傳入(默認(rèn))借杰,y以引用方式傳入过吻。 |
[&] | 任何被使用到的外部變量都隱式地以引用方式加以引用。 |
[=] | 任何被使用到的外部變量都隱式地以傳值方式加以引用蔗衡。 |
[&, x] | x顯式地以傳值方式加以引用纤虽。其余變量以引用方式加以引用。 |
[=, &z] | z顯式地以引用方式加以引用绞惦。其余變量以傳值方式加以引用逼纸。 |
舉個(gè)栗子!
int a, b, c;
[]( int x, int y ) { return a+x; } // Error! a不在捕獲列表中济蝉,不能引用a杰刽!
[a]( int x, int y ) { return a+x; } // OK.
[a]() { a=a+1; return a; } // Error! a是傳值方式,不能修改其值王滤。
[&a]() { a=a+1; return a; } // OK.
[&, a]() { ... } // a以傳值方式捕獲贺嫂,b,c以引用捕獲
[=, a]() { ... } // a以引用方式捕獲,b,c以傳值捕獲淑仆。
注意一下涝婉,如果要使用lambda函數(shù)的函數(shù)指針,捕獲列表必須為空[]
bool(*fp)(int, int)=[](int a,int b) { return a>b; }; //不捕獲時(shí)才可轉(zhuǎn)換為函數(shù)指針
() parameter list
參數(shù)列表蔗怠,類似普通函數(shù)的參數(shù)列表墩弯。
->return type
函數(shù)返回類型,可省略寞射,C++會(huì)自動(dòng)推導(dǎo)返回類型渔工,默認(rèn)是int.
注意,只有在lambda函數(shù)匹配"return expression"的形式下桥温,它的返回類型才能被忽略引矩。
[](int x,int y)->int { int z=x+y; return z+x; }
{ function body }
Nothing special // \笑臉
其他
- lambda函數(shù)是編譯器從屬類型的函數(shù)對(duì)象;這種類型名稱只有編譯器自己能夠使用。
如果用戶希望將lambda函數(shù)作為參數(shù)傳入旺韭,該類型必須是模版類型氛谜,或是必須創(chuàng)建一個(gè)std::function去獲取lambda的值。
但是使用auto關(guān)鍵字讓我們能夠更簡(jiǎn)便地存儲(chǔ)lambda函數(shù):
auto myLambdaFunc = [this]() { this->SomePrivateMemberFunction(); };
auto myOnheapLambdaFunc = new auto([=] { /*...*/ });
- 定義在與lambda函數(shù)相同作用域的參數(shù)引用也可以被使用区端。這種的參數(shù)集合一般被稱作closure(閉包)值漫。