在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
結果。