lambda是什么

本文深入探讨了C++11中的Lambda表达式,解释了它们如何在编译时转换为函数对象,并揭示了为何Lambda类型的推断需要用到auto关键字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学C++11的同学,肯定都知道这样一个名词:lambda。lambda有一个最大的好处是:可以捕获一系列的变量来保证参数数量正确。那么,lambda到底是什么东西呢?为什么lambda的类型必须用auto推断呢?非C++11是不是也有可以像lambda一样捕获变量的类型呢?
其实,lambda其实是函数对象。如果你学C++用的书是《C++ Primer(第5版)》(白书,书皮上有水弄出来的数字11),那么在10.3.2节Biggies函数中,会看到两个调用lambda的函数:

    stable_sort(words.begin(),words.end(),
      [](const string &l,const string &r)
          {return l.size()<r.size();});

以及:

    auto wc=find_if(words.begin(),words.end(),
              [sz](const string &s){return s.size()>=sz;});

其实,lambda在编译时被解析成函数对象。
比方说,stable_sort调用的lambda被解析为:

    struct{bool operator()(const string &l,const string &r)
        {return l.size()<r.size();}}()

而find_if调用的lambda为:

    struct a{int sz;a(int i):sz(i){}
      bool operator()(const string &s){return s.size()>sz;}}()

也就是说,lambda

    [ catch_list ] ( parm_list )-> return_type {function_body;}

被编译成

    struct struct_name{定义catch_list;
      struct_name(与catch_list类型一一对应的类型 ct):catch_list初始化为ct{}
      return_type operator()(parm_list){function_body;}
    }

struct_name通常是不知道的,你无法准确指定,所以,lambda的类型只能用auto推断,而不能直接指定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值