cpp的lambda表示式

雨天尊發表於2024-05-08

在C++中,lambda表示式提供了一種方便的方式來定義匿名函式。Lambda可以用來建立簡單的函式物件,常用於演算法庫中的函式引數,特別是在STL(Standard Template Library)中。
Lambda表示式的語法是這樣的:

[ capture ] ( parameters ) -> return-type {
    function-body
}

其中:

  • capture:捕獲列表,用於指定哪些變數從封閉的作用域中捕獲以及如何捕獲(值捕獲、引用捕獲、不捕獲、隱式捕獲)。例如,[x, &y]表示x透過值捕獲,而y透過引用捕獲。
  • parameters:引數列表,與普通函式的引數列表類似。如果沒有引數,可以省略或者寫成空括號()
  • return-type:返回型別。自C++14起,如果lambda函式體只包含一個return語句,或者返回型別顯而易見,則可以省略返回型別,編譯器會進行自動推斷。
  • function-body:函式體,包含了lambda的執行語句。

下面是一些lambda表示式的示例:
示例 1:無引數,簡單的列印

auto printHello = []() {
    std::cout << "Hello, World!" << std::endl;
};
printHello(); // 呼叫lambda表示式

示例 2:使用引數和返回值

auto add = [](int x, int y) -> int {
    return x + y;
};
std::cout << add(5, 3) << std::endl; // 輸出8

示例 3:值捕獲外部變數

int z = 4;
auto addZ = [z](int x) -> int {
    return x + z; // z透過值捕獲進來
};
std::cout << addZ(3) << std::endl; // 輸出7

示例 4:引用捕獲外部變數

int w = 4;
auto modifyW = [&w](int x) {
    w = x; // w透過引用捕獲,可以修改其值
};
modifyW(5);
std::cout << w << std::endl; // 輸出5

Lambda表示式是C++11及以後版本中的一個強大特性,它大大簡化了程式碼的編寫,尤其是在需要使用臨時函式物件的場合。


為什麼要使用auto?
因為lambda表示式的實際型別是一個匿名函式型別,不方便直接宣告
不使用auto來宣告lambda匿名函式
在C++中,每個Lambda表示式都有一個獨一無二的、編譯器生成的型別。因此,我們通常不能不使用auto直接宣告一個Lambda表示式的變數型別,除非我們使用C++11之後的標準模板庫中引入的std::function來包裝該Lambda表示式。
示例: 使用std::function宣告add

#include <functional>

// 使用std::function來宣告add變數,避免使用auto。
std::function<int(int, int)> add = [](int a, int b) {
    return a + b;
};

在這個示例中,我們使用std::function來指定add變數的型別。std::function<int(int, int)>指明瞭add是一個函式,它接受兩個int引數並返回一個int結果。