0%
Theme NexT works best with JavaScript enabled
C/C++ Lambda Function
syntax
[ captures ] ( params ) lambda-specifiers requires(optional) { body }
capture 子句 (也稱為 c + + 規格中的 lambda introducer 。 )
參數清單 (選)。 (也稱為 lambda 宣告子)
可變規格 (選)。
例外狀況規格 (選)。
尾端-傳回類型 (選)。
lambda 主體。
直接呼叫 Lambda Expression 1 2 3 4 5 6 #include <iostream> int main () { using namespace std; int n = [] (int x, int y) { return x + y; }(5 , 4 ); cout << n << endl; }
e.g. 1 2 3 4 5 6 7 8 9 10 11 #include <algorithm> #include <cmath> void abssort (float * x, unsigned n) { std::sort (x, x + n, [](float a, float b) { return (std::abs (a) < std::abs (b)); } ); }
capture closure
[=]
:lambda-introducer,也稱為 capture clause。
所有的 lambda expression 都是以它來作為開頭,不可以省略,它除了用來作為 lambda expression 開頭的關鍵字之外,也有抓取(capture)變數的功能,指定該如何將目前 scope 範圍之變數抓取至 lambda expression 中使用,而抓取變數的方式則分為傳值(by value)與傳參考(by reference)兩種,跟一般函數參數的傳入方式類似,不過其語法有些不同,以下我們以範例解釋:
[]
:只有兩個中括號,完全不抓取外部的變數。
[=]
:所有的變數都以傳值(by value)的方式抓取。
[&]
:所有的變數都以傳參考(by reference)的方式抓取。
[x, &y]
:x
變數使用傳值、y
變數使用傳參考。
[=, &y]
:除了 y
變數使用傳參考之外,其餘的變數皆使用傳值的方式。
[&, x]
:除了 x
變數使用傳值之外,其餘的變數皆使用傳參考的方式。
這裡要注意一點,預設的抓取選項(capture-default,亦即 =
或是 &
)要放在所有的項目之前,也就是放在第一個位置。
parameter list
定義此匿名函數的傳入參數列表,基本的用法跟一般函數的傳入參數列表一樣,不過多了一些限制條件:
不可指定參數的預設值。
不可使用可變長度的參數列表。
參數列表不可以包含沒有命名的參數。
參數清單在 lambda expression 中並不是一個必要的項目,如果不需要傳入任何參數的話,可以連同小括號都一起省略。
return type
指定 lambda expression 傳回值的型別,這個範例是指定傳回值型別為整數(int
),其他的型別則以此類推。如果 lambda expression 所定義的函數很單純,只有包含一個傳回陳述式(statement)或是根本沒有傳回值的話,這部分就可以直接省略,讓編譯器自行判斷傳回值的型別。
reference