Lambda表达式是C++11的一个新的语法糖,它可以让我们方便的定义和创建匿名函数
1.完整的声明格式
[capture list] (params list) mutable exception-> return type { function body }
capture list:捕获列表能够捕捉上下文中的变量以供Lambda函数使用。
params list: 与普通函数的参数列表一致,如果不需要参数传递,则可以连同括号“()”一起省略。
mutable*:解除函数的常量性,因为默认的lambda函数都是常函数,使用该关键字,()不能省略。
exception*:异常说明,用于Lamdba表达式内部函数抛出异常。(基本用不上)
-> return type:返回值类型,无返回值时,和箭头一起省略。
function body:函数体
2.capture list 捕获列表
- [] 表示不捕获任何变量
int _tmain(int argc, _TCHAR* argv[])
{
auto func = []{
std::cout << "lambdaFunc" << endl;
};
func();
return 0;
}
- [val] 通过值传递捕获val变量
int _tmain(int argc, _TCHAR* argv[])
{
int value = 1;
auto func = [value]{
//value++; --没加mutable修饰,不能修改捕获的值
std::cout << value << endl;
};
func();
return 0;
}
- [=] 通过值传递捕获所有可见区域的值
int _tmain(int argc, _TCHAR* argv[])
{
{
int value2 = 1;
}
{
int value = 1;
auto func = [=]()mutable{
value++; //--没加mutable修饰,不能修改捕获的值
std::cout << value << endl;
//std::cout << value2 << end; //不能捕获到该值
};
std::cout << value << endl; //1
func(); //2
std::cout << value << endl;//1
}
return 0;
}
4.[&] 通过引用传递捕获所有可见区域的值
{
int value2 = 1;
}
{
int value = 1;
auto func = [&]()mutable{
value++; //--没加mutable修饰,不能修改捕获的值
std::cout << value << endl;
//std::cout << value2 << end; //不能捕获到该值
};
std::cout << value << endl; //1
func(); //2
std::cout << value << endl;//2
}
5.[this] 捕获当前的this对象
6.[=,&]混合捕捉:例如[=,&val],除val外其他都是值传递