Lambda表达式是c++11时引入的特性
Lambda又被称作匿名函数
Lambda的本质是一个特殊的 匿名的类 它是一个带有operator()的类 即仿函数
首先 我们先来写一个仿函数和一段有同等效果的lambda表达式
#includeusing namespace std; class AddNum { public: //初始化列表 AddNum(int num) : num_(num) {}; //这里重载了()运算符 int operator()(int x) const { return num_ + x; } private: int num_; }; int main() { //创建一个类对象 并赋初始值为10 auto add_num = AddNum(10); //仿函数的特性:函数对象可以像函数对象一样调用 auto x = add_num(5); cout << "x: " << x << endl; //等号右边第一个[]里叫做捕获列表 初始化一个变量 //第一个()是参数 //最后{}就是函数体了 //当然在函数体之前还可以加一个返回值类型 这里我省略了 auto add_num2 = [lambda_num = 10](int x){return lambda_num + x; }; //就像使用仿函数一样调用lambda表达式 auto lambda_x = add_num2(5); cout << "lambda x:" << lambda_x << endl; return 0;
输出结果: x: 15
lambda x: 15
如图所示 lambda表达式无疑就是上面的那个类 只是简化的书写表达
当然 lambda的捕获列表也有多种形式:
auto add_num2 = [lambda_num = 10](int x){return lambda_num + x; };
也可以用一下方式表达:
int lambda_num = 10;
auto add_num2 = [=](int x){return lambda_num + x; };
使用[&]:
int test = 10;
auto func = [&] (int a, int b) {return a + b + test;};
test = 5
int sum = func(1, 3); //这里结果为9 如果不使用引用结果就为14
关键字mutable:
捕获的变量默认带const修饰符 加mutable可以修改const变量
int test = 10;
//编译报错,test成员不能修改
auto func = [test](int a, int b){test = 8; return a + b + test;};
//编译正常
auto func = [test](int a, int b)mutable {test = 8; return a + b + test;};



