标准C++库提供了诸如find, sort的工具函数,它们的Compare模板参数是一个典型的谓词函数。 但C++的函数中虽然可以定义内部类,但无法定义内部类模板,因此这个过程会比较麻烦。 为此C++11提供了Lambda表达式来简化谓词函数的定义和传递。

一个简单的Lambda函数是这样定义的:

[](int x, int y) -> int { return x + y; }
// 返回值可由 decltype(x + y) 推导出来,因此可以省略返回值声明
[](int x, int y) {return x+y; }

在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为。 与JavaScript闭包不同,C++变量传递有传值和传引用的区别。可以通过前面的[]来指定:

[]      // 不传递任何变量
[x, &y] // x传值,y传引用
[&]     // 引用方式传递所有用到的变量
[=]     // 传值方式传递所有用到的变量
[&, x]  // x传值,其他所有用到的变量传引用
[=, &z] // z传引用,其他所有用到的变量传值

如果使用[&]或是[=]的形式,this在lambda函数可见。

例如用for_each和Lambda表达式来实现accumulate的功能:

std::vector<int> someList;
int total = 0;
std::for_each(someList.begin(), someList.end(), [&total](int x) { total += x; });
std::cout << total;

来一个传值和传引用混用的例子:

int total = 0;
int value = 5;
[&, value](int x) { total += (x * value); };

还可以把Lambda表达式存到一个变量里:

auto myLambdaFunc = [this]() { this->SomePrivateMemberFunction(); };
auto myOnheapLambdaFunc = new auto([=] { /*...*/ });

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2015/10/09/cpp11-lambda.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。