一般的函数形式以及调用形式
int foo(int a,int b)
{
return a + b;
}
foo(1,2)
首先是匿名函数形式
[]//捕获列表 默认是按值捕获
()//参数列表
->int //函数返回值
int c2 = [](int a, int b) -> int
{
return a + b;
}(1,2);
//为了能够复用lamba表达式
auto f= [](int a, int b) -> int
{
return a + b;
};
int c3 = f(1, 2);
嵌套的lamba表达式 (函数式编程)
int c4=[](int n)
{
return [n](int x)
{
return n + x;
}(2);
}(1);
为了能够复用嵌套的lamba表达式
上面的式子等价于
auto f2= [](int n)
{
cout << "n=" << n << endl;
return [n](int x)
{
cout <<"x="<<x << endl;
return n + x;
};
};
int c5 = f2(1)(2);
这里有一个常考点,捕获列表,默认是按值捕获,(内部修改不会影响外部)
mutable是为了匿名函数t能够++t,不然报错t是右值,不能修改。
int t = 10;
auto f3 = [t]()mutable->int
{
return ++t;
};
auto f4 = [t]()mutable->int
{
return ++t;
};
//我们发现其实每个同个匿名内部都是按 值 捕获 ,不会改变外部的值,但是每次调用f3 f3内部会维持同一个地址 f4内部也会维持一个地址 f3,f4变量互不影响。
cout << f3() << endl;
cout << f4() << endl;
cout << f3() << endl;
cout << f4() << endl;
cout << t << endl;
上面充分说明了匿名内部是按 值 捕获,我们看看运行结果
我们发现其实每个同个匿名内部都是按 值 捕获 ,不会改变外部的值, f3内部会维持一个地址 f4内部也会维持一个地址 f3,f4变量互不影响。也就是外部t,f3中的t,f4中的t有各自的一个t地址
其实我们可以看看,t在外部地址,内部f3地质 ,内部f4地址
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127114831194.png?x-oss-process=image/watermark,type_Z
mFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzOTIzNzEz,size_16,color_FFFFFF,t_70)
当然我们也可以按引用捕获
//更一般的
t = 100;
//按值捕获
auto f5 = [t]()->int
{
cout << t << endl;
};
auto f6 = [&t]()->int
{
t = t + 15;
cout << t << endl;
return t;
};
cout << f6()<< endl;//外部的t是没有改变的
//捕获列表
int m = 1;
int n = 2;
//外面的参数都是按值捕获
[=]()
{
cout << m << " " << n << endl;
};
//外面的参数都是按引用捕获
[&]()
{
cout << ++m << " " << ++n << endl;
};