lambda function
介紹
lambda function 又稱為 anonymous function, 中文翻譯叫匿名函式, 其定義沒有名稱, 而且會依據定義的位置而有不同的 context, 而 function instance 和其綁定的 non-local 資料又稱為 closure。
C++ lambda
最簡單的定義語法為 []{}
,
這邊沒有指定參數和回傳型別,
這些都會自動判斷,
而呼叫方式跟一般函式一樣,
部份範例:
[&]{}; // ok: by-reference capture default
[=]{}; // ok: by-copy capture default
[&, i]{}; // ok: by-reference capture, except i is captured by copy
[=, &i]{}; // ok: by-copy capture, except i is captured by reference
// [&, &i] {}; // error: by-reference capture when by-reference is the default
// [=, this] {}; // error: this when = is the default
[&, this]{}; // ok: captures the enclosing class by reference
[=, *this]{}; // ok: captures the enclosing class by copy (C++17)
[&, *this]{}; // ok: captures the enclosing class by copy (C++17)
// [i, i] {}; // error: i repeated
// [this, *this] {}; // error: "this" repeated (C++17)
在指定好 capture 模式後, lambda 內用到 scope 內不存在的變數就會自動往外尋找, copy mode 就會複製一份, reference mode 就會參考過去, 但是也可以特別指定某些變數是要 copy 或 reference。
lambda function 也可以特別指定呼叫時要傳的參數,
語法就變成 [] () {}
,
部份範例:
auto f = [](auto&& a, auto&& b) { return a < b; };
lambda function 也可以指定回傳型別,
語法就變成 [] () -> type {}
。
還可以再加上 mutable 或 constexpr 的屬性,
語法就變成 [] () constexpr -> type {}
。
lambda function 本身不會造成 Heap allocation, 只有 closure 內的物件需要 Heap allocation 時才可能會觸發。
lambda function 有什麼好處?
lambda function 可以在要使用時直接寫定義, 所以馬上就可以看到函式內的操作, 也容易在使用時直接寫一小段需要的函式(例如呼叫 STL 內的函式), 而不必在外面寫比較麻煩的函式定義。
藉由 lambda function 我們可以做到動態產生函式, 依據執行期間的資訊, 來做出不一樣的 lambda function。