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++类型转换函数