C++11开始支持lambda(匿名函数或闭包):函数A中的匿名函数,可以直接访问(不需要传参)函数A的上下文环境才可见的变量(比如局部变量)
Lambda的结构:
[捕获列表](参数列表)(修饰符)->返回类型{匿名函数体};
捕获列表:捕获调用者上下文环境的需要访问的变量,可按值捕获或按引用捕获
- [] 什么也不捕获
- [=] 按值捕获一切变量
- [&] 按引用捕获一切变量
- [=,&a] 除了按引用捕获a,其他都按值捕获
- [a] 只捕获a
- [&a] 只捕获引用a
- [a,&b] 按值捕获a 引用捕获b
参数列表:
和函数参数列表一样
修饰符:
mutable: 在lambda匿名函数体里,按值捕获到的变量,是调用者函数中变量的只读拷贝(read-only),加入mutable后,匿名函数体内部可以修改这个拷贝值,但外部依然不变
匿名函数体:
和普通函数没有区别
lambda函数代码的可读性更好,尤其是对于小函数,不会污染任何名字的空间(本身就没名字)
目的:就地书写,就地使用,一个屏幕里看到的所有代码,不用在文件间找,lambda是一种局部的封装,局部的共享。全局的共享依然需要函数或仿函数
仿函数是编译器实习lambda的一种方式,编译器通常会把lambda函数转化为一个仿函数对象,lambda可视为仿函数的“语法糖”