lambda函数用来快速构建一个闭包,闭包是一种可以捕获作用域内的变量的一个匿名的函数对象
auto toNumber = [&](string const& s) -> unsigned {
...
}
[]:定义匿名函数
[&]:以引用形式捕获所有外部变量,也就是外部变量均可用
(string const &s) :匿名函数的参数
->:定义匿名函数
unsigned:函数返回值类型
{...}:函数实现体
- 传参方式为形参不影响实参,可以传引用传参
- 通过捕捉列表可以获取作用域外的值,但是不能被修改。【从上级获取的变量只有只读权限】
- 如果要使用原数据就需要在这个变量前面添加上&符号,注意这不是取地址的意思,而是引用这个变量
- 任何一个lambda类型都不相同,故两个代码完全相同的lambda不能互相赋值【可以通过一个lambda拷贝去构造另一个lambda】
捕捉列表的写法:
[=]() {}; //全部变量传值传参
[&]() mutable {}; //全部变量传引用传参
[=, &x]()mutable {};//接收所有变量,但只有x是引用传参
[&, x]() mutable {};//接收所有变量,单只有x是传值传参
[this]() {}; //在类里可以通过this,获取到this指针 【this不能直接写,需要在类里面才能使用】