《C++Primer》中对lambda表达式的解释如下:
lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。
微软官网对lambda表达式的解释如下:
1、捕获列表(capture list)
Lambda函数可以引用在它之外声明的变量. 这些变量的集合叫做一个闭包. 闭包被定义在Lambda表达式声明中的方括号[]内. 这个机制允许这些变量被按值或按引用捕获.下面这些例子就是:
[] //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
[x, &y] //x 按值捕获, y 按引用捕获.
[&] //用到的任何外部变量都隐式按引用捕获
[=] //用到的任何外部变量都隐式按值捕获
[&, x] //x显式地按值捕获. 其它变量按引用捕获
[=, &z] //z按引用捕获. 其它变量按值捕获
2、参数列表(parameter list),可选
3、mutable 选项(可选)
加上mutable后,lambda表达式体内的语句可以修改按值捕获的变量。
4、异常选项(可选)
加上throw()表示lambda表达式不抛出任何异常。
5、尾部返回类型(trailing-return-type) (可选)
一般来讲lambda表达式的返回值都可以由编译器自动猜测除非你指明了尾部返回类型。
6、函数体(function body)
和普通函数一样。
Lambda表达式的一个重要用途
在
使用标准库函数的时候,可以大大简化函数调用。
下面的代码及使用建议来自
《Google C++ Style Guide》
std::sort(v.begin(), v.end(), [](int x, int y) {
return Weight(x) < Weight(y);
});
int weight = 3;
int sum = 0;
// Captures `weight` by value and `sum` by reference.
std::for_each(v.begin(), v.end(), [weight, &sum](int x) {
sum += weight * x;
});
std::set<int> blacklist = {7, 8, 9};
std::vector<int> digits = {3, 9, 1, 8, 4, 7, 1};
digits.erase(std::remove_if(digits.begin(), digits.end(), [&blacklist](int i) {
return blacklist.find(i) != blacklist.end();
}),
digits.end());
Lambda表达式的 使用建议
- Keep unnamed lambdas short. If a lambda body is more than maybe five lines long, prefer to give the lambda a name, or to use a named function instead of a lambda.