lambda:算法
C++11提供了對匿名函數的支持,稱爲Lambda函數(也叫Lambda表達式). Lambda表達式具體形式以下:閉包
匿名函數定義/匿名錶達式聲明:[capture](parameters)->return-type{body}函數
函數調用:function a = [capture](parameters)->return-type{body};this
a(parameters);spa
parameters:形參code
和函數同樣對象
若是沒有參數,空的圓括號()能夠省略.blog
返回值也能夠省略,若是函數體只由一條return語句組成或返回類型爲void的話.形如:作用域
[capture](parameters){body}編譯器
返回值類型能夠經過如下算法推演出來
例如:
[](int x, int y) { return x + y; } // 隱式返回類型 [](int& x) { ++x; } // 沒有return語句 -> lambda 函數的返回類型是'void' []() { ++global_x; } // 沒有參數,僅訪問某個全局變量 []{ ++global_x; } // 與上一個相同,省略了()
[]:外部閉包
Lambda函數能夠引用在它以外聲明的變量. 這些變量的集合叫作一個閉包. 閉包被定義在Lambda表達式聲明中的方括號[]內.
閉包能夠按值、引用捕獲:
例如:
[] //未定義變量.試圖在Lambda內使用任何外部變量都是錯誤的. [x, &y] //x 按值捕獲, y 按引用捕獲. [&] //用到的任何外部變量都隱式按引用捕獲 [=] //用到的任何外部變量都隱式按值捕獲 [&, x] //x顯式地按值捕獲. 其它變量按引用捕獲 [=, &z] //z按引用捕獲. 其它變量按值捕獲
對this的捕獲:只能夠是值捕獲,
在類成員中的lamda函數:
對protect和priviate成員來講, 這個lambda函數與建立它的成員函數有相同的訪問控制.
訪問this的成員沒必要使用this->語法,能夠直接訪問.
注意:若是一個閉包含有局部變量(類和局部)的引用,在超出建立它的做用域以外的地方被調用的話,這種行爲是未定義的!
lambda函數是一個依賴於實現的函數對象類型,這個類型的名字只有編譯器知道.
若是用戶想把lambda函數作爲一個參數來傳遞, 那麼形參的類型必須是模板類型或者必須能建立一個std::function相似的對象去捕獲lambda函數.
使用 auto關鍵字能夠幫助存儲lambda函數,