C++11 lambda的理解

 

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

 

转载于:https://my.oschina.net/tasker/blog/724446

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值