c++中lambda表示式
阿新 • • 發佈:2021-07-29
lambda表示式概述
[函式物件引數] (操作符過載函式引數) mutable 或 exception 宣告 -> 返回值型別 {
函式體
}
引數型別說明:
1.[函式物件引數]:捕捉列表。捕捉列表總是出現在Lambda函式的開始處,[]是Lambda引出符,必須存在,不可省略!
編譯器根據該引出符判斷接下來的程式碼是否是Lambda函式。捕捉列表能夠捕捉上下文中的變數以供Lambda函式使用;
函式物件引數形式列表
- 空。沒有任何函式物件引數。
- =。函式體內可以使用 Lambda 所在範圍內所有可見的區域性變數(包括 Lambda 所在類的 this),並且是值傳遞方式(相當於編譯器自動為我們按值傳遞了所有區域性變數)。
- &。函式體內可以使用 Lambda 所在範圍內所有可見的區域性變數(包括 Lambda 所在類的 this),並且是引用傳遞方式相當於是編譯器自動為我們按引用傳遞了所有區域性變數)。
- this。函式體內可以使用 Lambda 所在類中的成員變數。
- a。將 a 按值進行傳遞。按值進行傳遞時,函式體內不能修改傳遞進來的 a 的拷貝,因為預設情況下函式是 const 的,要修改傳遞進來的拷貝,可以新增 mutable 修飾符。
- &a。將 a 按引用進行傳遞。
- a,&b。將 a 按值傳遞,b 按引用進行傳遞。
- =,&a,&b。除 a 和 b 按引用進行傳遞外,其他引數都按值進行傳遞。
- &,a,b。除 a 和 b 按值進行傳遞外,其他引數都按引用進行傳遞
2.[操作符過載函式引數]:標識過載的 () 操作符的引數,沒有引數時,這部分可以省略,可以連同括號“()”一起省略。
引數可以通過按值(如: (a, b))和按引用 (如: (&a, &b)) 兩種方式進行傳遞。
3.mutable 或exception 宣告:mutable可變變數,exception 異常
注:在使用該修飾符時,引數列表不可省略(即使引數為空);
4.[返回值型別]:返回型別,當不需要返回型別時(void),可以省略
5.[函式體] : 函式內容,可以使用上下文的資料。
例項
[&]() { int a = 1;}; // 無參無返回 [&](int a) { int b = a + 1;}; // 單參無返回 [&](int a,int b) { int c = a + b;}; // 雙參無返回 [&]() -> int { return 1;}; // 無參返回 [&](int a) -> int { return a + 1;}; // 無參無返回
function函式
標頭檔案functional.h
用於宣告函式
std::function<int(int,int)> mod = [](int i, int j){return i % j; };
這裡std::function<int(int,int)>的作用就類似於int和auto。