//C++新特性 lambda表达式与匿名函数
/*
Lambda是C++11最重要的特性之一,实际上就是提供了一个类似匿名函数的特性,而匿名函数则是一个函数,但是
又不想费力去命名一个函数的情况下使用的。这样的常见其实很多,所以匿名函数几乎是现代编程语言的标配
[捕获列表] (参数列表) mutable(可选) 异常属性(throw) -> 返回值类型
{
函数体
}
[caputrue] (params) opt ->ret
{
body
}
在最适合lambda表达式的场景,如果你一定要用class表达,那么你需要为你的类定义一个十分臃肿的构造函数,传进去一大堆参数,然后返回一个值就把这个对象扔了。然而用lambda表达式的话,你只要把这些捕获为闭包就行了
*/
int foo(int a)
{
std::cout << a << std::endl;
return a;
}
int main()
{
//没有名字的表达函数(匿名函数)
int b = 1;
//[]捕获列表 ()参数列表 ->返回值类型
int c = [](int a, int b) ->int
{
return a + b;
}(1, 2);
//函数传递匿名函数
foo([](int a,int b) ->int
{
return a+b;
}(1,2)
);
//将匿名函数存储到f
auto f=[](int a, int b) ->int
{
return a + b;
};
c = f(1, 2);
//两个lambda表达式 ,内联嵌套,函数编程
int c = [](int n)
{
return [n](int x){
return x + n;
}(1);
}(2);
//不直接使用
auto f01 = [](int n)
{
return [n](int x){
return x + n;
};
};
int c = f01(1)(2);
int t = 10;
//按值捕获对象
[t]()
{
std::cout << t << std::endl; //按值捕获在调用时,在调用时参数值多少就是多少
};
t = 11;
//按引用捕获
[&t]()
{
t = 11;
}; //可以修改值
//捕获所有变量的值,表示安值捕获
[=]()
{
};
//捕获所有变量的值,表示安引用捕获
[&]()
{
};
while (true)
{
}
return 0;
}