Lambda表达式
C++11 提供了对匿名函数的支持,称为 Lambda 函数(也叫 Lambda 表达式)。
Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。
Lambda 表达式本质上与函数声明非常类似。Lambda 表达式具体形式如下:
[capture](parameters)->return-type{body}
[](int x, int y){ return x < y ; }
如果没有返回值:
[capture](parameters){body}
笔记
[capture]:捕获列表,[ ]中需要捕获的值。捕获列表是空或多个捕获符的逗号分隔符列表。lambda的数据成员也在lambda对象创建时被初始化。
[] //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
[x, &y] //x 按值捕获, y 按引用捕获.
[&] //用到的任何外部变量都隐式按引用捕获
[=] //用到的任何外部变量都隐式按值捕获
[&, x] //x显式地按值捕获. 其它变量按引用捕获
[=, &z] //z按引用捕获. 其它变量按值捕获
(parameters):参数。lambda形参列表和一般的函数形参列表类似,但不允许默认实参(C++14 前)。当以 auto 为形参类型时,该 lambda 为泛型 lambda(C++14 起)。与一个普通函数调用类似,调用一个lambda时给定的实参被用来初始化lambda的形参。
mutable:允许 函数体 修改各个复制捕获的对象,以及调用其非 const 成员函数;
int i = 10, j = 10;
//加上mutable才可以在lambda函数中改变捕获的变量值
auto f = [i, &j]() mutable {i = 100, j = 100;};
i = 0, j = 0;
返回类型 ->
当我们需要为一个lambda定义返回类型时,需要使用尾置返回类型。返回类型若缺省,则根据函数体中的 return 语句进行推断(如果有多条return语句,需要保证类型一直,否则编译器无法自动推断)。默认情况下,如果一个lambda函数体不包含return语句,则编译器假定返回void。
auto f = []() -> double {
if (1 > 2)
return 1;
else
return 2.0;
};
如果不显示指定返回类型,则int和double两种返回类型会导致推断冲突。