介绍lambda
可调用的对象:函数、函数指针、重载了函数调用运算符的类 以及 lambda表达式;
形式:[capture list] (parameter list) -> return type { function body }
lambda必须使用尾置返回,且不能有默认参数,一个lambda调用的实参数目永远与形参数目相等;
如果lambda的函数体包含任何单一 return 语句之外的内容,且未指定返回类型,则返回void。
一个lambda只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数体中用到该变量。但是可以直接使用定义在当前函数之外的名字。
捕获列表只用于局部非static变量,可以直接使用局部static变量和在它所在函数之外声明的名字。
捕获与返回
当向一个函数传递一个lambda时,同时定义了一个新类型和该类型的一个对象,传递的参数就是此编译器生成的类类型的未命名对象;
变量捕获的方式:值捕获 和 引用捕获;
值捕获:捕获的前提是变量可以拷贝,被捕获的变量的值在lambda创建的时候拷贝,而不是调用时拷贝;
引用捕获:前提是要确保被引用的对象在lambda执行的时候是存在的;
为了尽量保证lambda的变量捕获简单化,如果可能的话,尽量避免捕获指针或者引用;
隐式捕获
除了显示的在捕获列表中列出想要捕获的变量,还可以让编译器推断我们需要哪些变量,此方法需要在捕获列表中写一个 & 或 =, & 告诉编译器采用引用捕获的方式,= 则是采用值捕获的方式;
混合隐式捕获:捕获列表第一个元素是 &或=,后面一个变量是一个列表,指明运用与前一个捕获相反的方式的变量;
一般对一个值被拷贝的变量,lambda并不会改变其值。如果我们希望可以改变一个被捕获变量的值,需要在参数列表首加上关键字mutable;