c++11之Lambda表达式

lambda表达式

语法

下面就是lambda式的基本语法
[捕获列表] (**参数列表)**限定符 异常 ->返回类型 {函数体}
其中限定符,异常返回类型都是可选的

[](int a,int b){return a+b;}

这就是一个简单的lambda表达式

lambda表达式分一种是捕获变量,一种是不捕获变量

捕获变量

#include <cstdio>
#include<iostream>
using namespace std;

int main()
{
  int a=2;
  int b=3;
  auto p=[=](){
      cout<<a+b;
    };
  p();
}

在捕获变量的时候,编译器会为我们生成一个lambda类

int main()
{
  int a = 2;
  int b = 3;
    
  class __lambda_9_12
  {
    public: 
    inline /*constexpr */ void operator()() const
    {
      std::cout.operator<<(a + b);
    }
    
    private: 
    int a;
    int b;
    
    public:
    __lambda_9_12(int & _a, int & _b)
    : a{_a}
    , b{_b}
    {}
    
  };
 
  __lambda_9_12 p = __lambda_9_12{a, b};
  p.operator()();
  return 0;
}

我们可以看到重载了()操作符,并且这个函数是const的,从而知道为什么按值捕获在函数内不能修改变量值了。

不捕获

#include <cstdio>
#include<iostream>
using namespace std;

int main()
{
  int a=2;
  int b=3;
    auto p=[](int x,int y){
      cout<<x+y;
    };
  p(a,b);
}

编译器同样会为我们生成一个lambda类,并且,还会多一个类型转换函数

int main()
{
  int a = 2;
  int b = 3;
    
  class __lambda_9_12
  {
    public: 
    inline /*constexpr */ void operator()(int x, int y) const
    {
      std::cout.operator<<(x + y);
    }
    
    using retType_9_12 = void (*)(int, int);
    inline constexpr operator retType_9_12 () const noexcept
    {
      return __invoke;
    };
    
    private: 
    static inline /*constexpr */ void __invoke(int x, int y)
    {
      __lambda_9_12{}.operator()(x, y);
    }
    
    
  };
  
  __lambda_9_12 p = __lambda_9_12{};
  p.operator()(a, b);
  return 0;
}

可以看到,这个类型转换函数是将lambda类型转换成为一个函数指针,这样在不捕获变量的时候,我们可以直接将lambda表达式当成一个函数指针使用。

[1]c++类型转换函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值