[C++11]Lambda表達式的使用

C++11引入了Lambda表達式。Lambda表達式的引入,方便了簡短函數的定義,爲經常使用的一次性函數的定義和使用提供了很大的便利。函數

Lambda表達式其實是一種匿名函數定義,經常使用來定義簡單和不重複使用的函數。其可以使用的外部變量、定義方式等都與常規函數有所不一樣。this

#語法結構# Lambda表達式的完整定義結構以下:指針

auto f = [函數對象參數](函數參數列表) mutable throw(類型)->返回值類型 {函數語句};

auto是C++11新引入的關鍵字,主要用來自動推斷變量的類型,Lambda表達式返回一個函數指針,能夠用通常的函數指針定義式來指示類型,可是在C++11中,使用auto更爲簡便。調用Lambda定義的函數,能夠直接使用如下語句來調用:code

f(實參列表);

Lambda表達式的定義結構分爲六個部分:對象

  1. 函數對象參數部分,Lambda表達式的引入部分,用於初始化Lambda表達式,其中[]中能夠填入一些標識來指示Lambda表達式如何捕獲能夠訪問的變量。Lambda表達式能夠捕獲的變量只限於在Lambda表達式定義位置以前出現的變量。標識的放置有如下幾種方式:
  • 空白表示不使用任何參數,僅可以使用形參列表中的參數。
  • =(等號),表示使用的變量以值傳遞的方式捕獲,能夠直接使用this指針,再也不須要顯式列舉this。
  • &(與號),表示使用的變量以引用傳遞的方式捕獲,能夠直接使用this指針,不在須要顯示列舉this。
  • this,表示Lambda表達式可使用所在類中的成員變量。
  • 變量名,表示在Lambda表達式中,該變量使用以值傳遞的方式捕獲。
  • &變量名,表示在Lambda表達式中,該變量使用以引用傳遞的方式捕獲。
  • 組合方式,以逗號分隔各個捕獲標識,特殊標識的變量按照特殊方式捕獲,其他按照默認的標識進行捕獲,例如[=, &a, &b]表示a與b兩個變量按引用捕獲,其他變量按值捕獲。
  1. 函數參數列表與常規函數定義中的形參列表相同。
  2. mutable關鍵字,表示能夠修改按值傳入的變量的副本(不是值自己),相似於不帶const關鍵字的形參。使用mutable關鍵字後對按值傳入的變量進行的修改,不會將改變傳遞到Lambda表達式以外。
  3. throw(類型)表達式,表示Lambda表達式能夠拋出指定類型的異常。
  4. ->返回值類型,指示Lambda表達式定義的匿名函數的返回值類型。
  5. 函數語句,跟常規函數的函數語句相同,若是指定了函數的返回值類型,函數實現語句中必定須要return來返回相應的類型的值。

#基本示例#table

##基本Lambda表達式的使用##匿名函數

lang: cpp
int x = 10;
int y = 20;
int z;
z = [=](int a, int b) -> int { return (a + x) * (b + y); }(1, 2);
cout << z << endl;

最後輸出結果爲242。Lambda表達式在定義以後能夠直接使用()進行調用。變量

##函數指針的使用##語法

lang: cpp
typedef int (*Func)(int&, int&);
Func f = [](int& a, int& b) -> int { return a + b; };

這種方式定義的f跟前面用auto定義的f是一致的。調用方法也跟日常的函數指針一致。引用

##關於mutable##

lang: cpp
int x = 1;
int y = 1;
int z;
cout << "x1: " << x << "/t y1: " << y << endl;
z = [=]() mutable -> int
{
    int n = x + y;
    ++x;
    ++y;
    cout << "x2: " << x << "/t y2: " << y << endl;
    return n;
}();
cout << "x3: " << x << "/t y3: " << y << endl;
cout << "z: " << z << endl;

輸出的結果爲:

lang: cpp
x1: 1 y1: 1
x2: 2 y2: 2
x3: 1 y3: 1
z: 2

mutable關鍵字只能在Lambda表達式定義體以內改變x和y的值,可是這種改變並不能傳遞到定義體以外。

相關文章
相關標籤/搜索