lanmbda表达式形式如下:
[capture list] (parameter list) ->return type { function body }
捕获列表
capture list 为捕获列表,是函数体内局部变量的列表(通常为空)。
捕获有值捕获和引用捕获两种形式:
auto f1 = [v1]{ return v1; }; //值捕获
auto f2 = [&v2] { return v2;}; //引用捕获
隐式捕获
在捕获列表中填写=(值捕获)或&(引用捕获)来让编译器推断捕获列表。
混用显示捕获和隐式捕获时,列表中第一个元素必须是&或=,&和=不能同时存在。
并且在使用&后,显示捕获不能有引用捕获;使用=亦然。
可变lambda
如果希望能改变捕获的值,应在参数列表首加上关键字mutable:
auto f = [v1] () mutable { return ++v1; }; //v1会被改变
传递参数
lambda表达式不能含有默认参数。
返回值
默认情况下,如果lamba体内包含除return外语句,编译器假定返回void,需要自定返回类型,需要使用尾置返回类型:
auto f = [] (int i) -> int { if(i>0) return i; else return -i; };