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。