标签:
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单独以引用方式捕获,其余都为传值
//例子2
// 遍历所有窗口句柄 // int main() { auto func = [](HWND hwnd,LPARAM lpm){ printf("wnd : %d\n",hwnd); return 1; }; EnumWindows(func,0); Sleep(INFINITE); return 0; }
;
;对上面这段函数进行反汇编:
;
00991000 >/$ 6A 00 push 0 ; /lParam = 0 00991002 |. 68 18109900 push <lambda_e719811ef777855facd3e231>; |Callback = ConsoleA.<lambda_xxxxxxxx> 00991007 |. FF15 04B19900 call dword ptr [<&USER32.EnumWindows>>; \EnumWindows 0099100D |. 6A FF push -1 0099100F |. FF15 00B09900 call dword ptr [<&KERNEL32.Sleep>] 00991015 |. 33C0 xor eax, eax 00991017 \. C3 retn 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
标签:
原文地址:http://www.cnblogs.com/codetask/p/5617025.html