Lambda函数的语法相当直截了当。方括号中的第一个lambda元素告诉编译器,本地变量total通过引用被捕捉(这样的情况下最好用引用捕 捉,因为你需要矢量和的结果在for_each之后仍然有效),而lambda的第二部分则是参数列表。Lambda的最后一部分是函数的主体,这个例子 中就是将参数x的值加到变量total中去。
如果在lambda函数中没有需要捕捉的变量,或者只需要捕捉变量的一个副本,那么函数开始的方括号可以留空:
std::for_each(v.begin(), v.end(), [](int x) {
std::cout << x << std::endl;
});
std::cout << x << std::endl;
});
混合的捕捉方法也可以使用:
int total = 0;
bool displayInput = true;
std::for_each(v.begin(), v.end(), [&total, displayInput](int x) {
total += x;
if (displayInput){
std::cout << x << std::endl;
}
});
bool displayInput = true;
std::for_each(v.begin(), v.end(), [&total, displayInput](int x) {
total += x;
if (displayInput){
std::cout << x << std::endl;
}
});
这里,变量displayInput通过副本被捕捉。Visual C++编译器在编译时会报错C3491:'displayInput':一个在lambda函数内数值被改变的变量无法在一个非可变lambda中通过数值被捕捉。
Lambda函数中还有一个值得注意的地方,就是它的返回值类型。编译器一般会尽可能的(也是被要求的)推断lambda表达式的返回值类型,不过 对于复杂的多行表达式而言,有可能会需要确切的声明返回值类型。返回值类型声明通过在lambda函数参数和函数主体之间添加-﹥运行符以及需要被声明的 返回值类型来实现:
std::for_each(v.begin(), v.end(),
[&](int x)->void {total += x;});
}
[&](int x)->void {total += x;});
}
C++中有了lambda函数,这令声明式编程以及使用STL运算法则变得更加简洁。Lambda函数允许在函数主体内的可执行代码字行间进行定义。在为 编译器提供强大的优化提示之外,Lambda函数所推崇的代码模式可以令人更加简单的理解哪段代码是要实现怎样的功能。Visual C++ 2010将带来在并行处理上的显著功能提升,而lambda函数将是具体实现这些提升的重要手段之一。