Lambda in C++11

——From《The C++ Standard Library:A tutorial and reference (2nd Edition)》 3.1.10 Lambdas

最近经常要用到STL,感觉不如仔细学一学,所以开始啃这本蛮厉害的书了~

 

在C++11中,lambda 表达式(通常称为 “lambda”)是一种在被调用的位置或作为参数或局部对象传递给函数的位置定义匿名函数对象的简便方法。类似于Python或JavaScript中的闭包,简单理解就是一个临时使用的函数,使用完一次后就没用了,就像有些局部变量一样。

首先来看Lambda的语法(Syntax of Lambda):

(From https://msdn.microsoft.com/zh-cn/library/dd293608.aspx )

Lambda表达式一般都由[]引导(Lambda introducer),一方面用来引导,另一方面用来访问和获取一些环境中的变量(Access to outer scope):

  • [=]表示外部变量是通过值传递即复制到局部变量中
  • [&]表示外部变量是通过引用传递即传地址

int x = 0;
int y = 42;
auto qqq = [x,&y]{
std::cout << "x: " << x << std::endl; std::cout << "y: " << y << std::endl; ++y; //OK } x = y =77; qqq(); //x: 0 y: 77 qqq(); //x: 0 y: 78 std::cout << "final y: " << y << std::endl; //final y: 79

除了用[x,&y]之外,还可以用[=,&y]来传递y的引用和其他变量的值(觉得是需要哪个传哪个……)。还可以使用关键字mutable,使得在[]中提到的变量传递引用,其他变量传递值:
int id = 0;
auto f = [id] () mutable {
std::cout << "id: " << id << std::endl; ++id; //OK }; id = 42; f(); //id: 0 f(); //id: 1 f(); //id: 2 std::cout << id << std::endl; //42

空子句[]表示Lambda表达式主体不访问封闭范围内的变量。

capture后跟省略号是包扩展,如以下可变参数模板示例中所示:

[] {
return 42;
}

[] () -> double {
return 42; //return 42.0
}

auto x1 = [](int i){ return i; }; // OK: return type is int
auto x2 = []{ return{ 1, 2 }; }; // ERROR: return type is void, deducing
// return type from braced-init-list is not valid

一个Lambda表达式可以返回另一个表达式。
Lambda表达式的类型是一个匿名函数对象,所以需要用template或者auto来声明此类对象。如果需要类型,可以使用decltype()或者用std::functonal<>类模板,如下:

#include
#include

std::function returnLambda ()
{
return [] (int x, int y){
return x*y;
};
}
int main()
{
auto lf = returnLambda();
std:cout << lf(6,7) << std::endl; }

发表评论

电子邮件地址不会被公开。 必填项已用*标注