匿名函數是許多編程語言都支持的概念,有函數體,沒有函數名。1958年,lisp首先採用匿名函數,匿名函數最經常使用的是做爲回調函數的值。正由於有這樣的需求,c++引入了lambda 函數,你能夠在你的源碼中內聯一個lambda函數,這就使得建立快速的,一次性的函數變得簡單了。例如,你能夠把lambda函數可在參數中傳遞給std::sort函數。ios
#include "stdafx.h" #include <algorithm> //標準模板庫算法庫 #include <cmath> //數學庫 #include <iostream> using namespace std; //絕對值排序 void abssort(float* x, unsigned n) { //模板庫排序函數 std::sort(x, x + n, // Lambda 開始位置 [](float a, float b) { return (std::abs(a) < std::abs(b)); } // lambda表達式結束 ); } int _tmain(int argc, _TCHAR* argv[]) { float a[5] = { 2.1f, 3.5f, 4.0f, 5.2f, 3.3f }; abssort(a, 5); for (auto& x : a) { cout << x << endl; } system("pause"); return 0; }
基本形式以下:c++
[capture](parameters)->return-type {body}
外部變量的捕獲規則算法
默認狀況下,即捕獲字段爲 [] 時,lambda表達式是不能訪問任何外部變量的,即表達式的函數體內沒法訪問當前做用域下的變量。編程
若是要設定表達式可以訪問外部變量,能夠在 [] 內寫入 & 或者 = 加上變量名,其中 & 表示按引用訪問,= 表示按值訪問,變量之間用逗號分隔,好比 [=factor, &total] 表示按值訪問變量 factor,而按引用訪問 total。編程語言
不加變量名時表示設置默認捕獲字段,外部變量將按照默認字段獲取,後面在書寫變量名時不加符號表示按默認字段設置,好比下面三條字段都是同一含義:函數
[&total, factor]
[&, factor]
[=, &total]this
#include <functional> #include <iostream> using namespace std;int _tmain(int argc, _TCHAR* argv[]) { //lambd函數對象 auto fl = [](int x, int y){return x + y; }; cout << fl(2, 3) << endl; function<int(int, int)>f2 = [](int x, int y){return x + y; }; cout << f2(3, 4) << endl; system("pause"); return 0; }
不能訪問任何局部變量lua
如何傳進去局部變量spa
int test = 100; //lambd函數對象捕獲局部變量 auto fl = [test](int x, int y){return test +x + y; }; cout << fl(2, 3) << endl;
默認訪問全部局部變量3d
int test = 100; //lambd函數對象捕獲全部局部變量 auto fl = [=](int x, int y){return test +x + y; }; cout << fl(2, 3) << endl;
在C++11中這一部分被成爲捕獲外部變量
[captures] (params) mutable-> type{...} //lambda 表達式的完整形式
在 lambda 表達式引出操做符[ ]裏的「captures」稱爲「捕獲列表」,能夠捕獲表達式外部做用域的變量,在函數體內部直接使用,這是與普通函數或函數對象最大的不一樣(C++裏的包閉必須顯示指定捕獲,而lua語言裏的則是默認直接捕獲全部外部變量。)
捕獲列表裏能夠有多個捕獲選項,以逗號分隔,使用了略微「新奇」的語法,規則以下
下面代碼示範了這些捕獲列表的用法:、
int x = 0,y=0;
值得注意的是變化的捕獲發生在了lambda表達式的聲明之時,若是使用值方式捕獲,即便以後變量的值發生變化,lambda表達式也不會感知,仍然使用最初的值。若是想要使用外部變量的最新值就必須使用引用的捕獲方式,但也須要小心變量的生命週期,防止引用失效。
剛纔的lambda表達式運行結果是: