C++11 的 lambda 表达式规范如下:
[ capture ] ( params ) mutable exception attribute -> ret { body } (1)
[ capture ] ( params ) -> ret { body } (2)
[ capture ] ( params ) { body } (3)
[ capture ] { body } (4)
// 简单的例子
// 这个例子有2个参数x和y 返回x+y
[](int x,int y){ return x+y; };
[] // 不捕获外部变量其实看起来和函数差不多
只不过使用了[]代替了函数名,
[]里面的捕获参数:
[&] // 引用形式捕获所有外部变量
[=] // 传值形式捕获所有外部变量
[x, &y] // x以传值捕获(默认),y 以引用捕获。
[&, x] // x单独以传值方式捕获,其余都为引用
[=, &x] // x单独以引用方式捕获,其余都为传值
// 遍历所有窗口句柄
//
int main()
{
auto func = [](HWND hwnd,LPARAM lpm){
printf("wnd : %d\n",hwnd);
return 1;
};
EnumWindows(func,0);
return 0;
}
;
;对上面这段函数进行反汇编:
;
00991000 >/$ 6A 00 push 0 ; /lParam = 0
00991002 |. 68 18109900 push <lambda_00991018> ; |Callback
00991007 |. FF15 04B19900 call dword ptr [<&USER32.EnumWindows>>; \EnumWindows
Callback:
00991018 >/. 55 push ebp
00991019 |. 8BEC mov ebp, esp
0099101B |. FF75 08 push dword ptr [ebp+8] ; /<%d>
0099101E |. 68 00039A00 push 009A0300 ; |format = "wnd : %d",LF,""
00991023 |. E8 35070000 call printf ; \printf
00991028 |. 59 pop ecx
00991029 |. 33C0 xor eax, eax
0099102B |. 59 pop ecx
0099102C |. 40 inc eax
0099102D |. 5D pop ebp
0099102E \. C2 0800 retn 8