C++11lambda表達式

1. lambda的申明方式

Lambda表達式是c++11的新特性,它容許程序員在函數內部建立一個匿名函數,對於一些小型的功能模塊,能夠使用lambda表達式來實現。不少其餘語言已經有了lambda表達式,好比objective-c中block就相似。c++

Lambda表達式的聲明方式:程序員

例如:objective-c

auto fadd = [](int a, int b)
{
    return a + b;
};

Fadd就是一個匿名函數,後面是它的實現,auto是自動類型,也是c++11新加入的特性,auto能夠自動判斷類型。[]表示開始定義lambda表達式,他能夠帶參數,()裏面的是函數的參數, {}體內的是函數體。這裏函數的返回值隱含了,也能夠指明函數的返回值。例如函數

顯示指明返回值,採用:this

auto fadd = [](int a, int b)->int
{
    return a + b;
};

總結:lambda表達式的申明形勢爲指針

[captures] (params) -> ret {Statments;}c++11

2. lambda表達式的變量截取

考慮這樣一種狀況,加入你的lambda表達式須要使用外部變量,那該怎麼辦呢?lambda表達式提供了變量截取的功能。code

例如:作用域

int val = 1;
auto fadd = [&](int a, int b)->int
{

   return val = a + b + val;

};
cout << fadd(2, 3) <<endl;
cout << "val = " << val<< endl;

val是外部變量,若是在fadd中須要訪問val,必須在[]中指明截取方式,這裏用的&表示截取外部做用域中全部變量,並做爲引用在函數體中使用。匿名函數

Lambda表達式中有多種變量截取方式。

下面是各類變量截取的選項:

  • [] 不截取任何變量
  • [&} 截取外部做用域中全部變量,並做爲引用在函數體中使用
  • [=] 截取外部做用域中全部變量,並拷貝一份在函數體中使用
  • [=, &foo] 截取外部做用域中全部變量,並拷貝一份在函數體中使用,可是對foo變量使用引用
  • [bar] 截取bar變量而且拷貝一份在函數體重使用,同時不截取其餘變量
  • [this] 截取當前類中的this指針。若是已經使用了&或者=就默認添加此選項。
相關文章
相關標籤/搜索