目錄
1.認識 lambda
1.1.捕獲列表 [ ]
1.2.形參列表 ( )
1.3.說明符
1.4.返回型別 ->
1.5.函式體
2.基本使用
3.參考
lambda的基本語法如下:
當定義乙個lambda時,編譯器生成乙個與lambda對應的新的(未命名的)類型別。下面對重要的組成部分進行說明:
捕獲列表是零或多個捕獲符的逗號分隔符列表,可選地以預設捕獲符開始(僅有的預設捕獲符是 & 和 = )。預設情況下,從lambda生成的類都包含乙個對應該lambda所捕獲變數的資料成員。類似任何普通類地資料成員,lambda的資料成員也在lambda物件建立時被初始化。類似引數傳遞,變數的捕獲方式也可以是值或引用。
值捕獲:
void func()
; i = 0;
int j = f(); //j=100,因為i是建立時拷貝的
}
引用捕獲:
void func()
; i = 0;
int j = f(); //j=0,傳遞的是引用
}
除了自己列出捕獲列表的變數,還可以讓編譯器根據lambda中**來推斷我們要使用哪些變數(隱式捕獲),用過使用&或=指示編譯器推斷捕獲列表。&則採用引用捕獲的方式,=則採用值捕獲的方式。混合使用隱式捕獲和顯示捕獲,則兩者須使用不同的方式,乙個為引用捕獲,乙個為值捕獲。
lambda捕獲列表:
懸垂引用:若以引用隱式或顯式捕獲非引用實體,而在該實體的生存期結束之後呼叫lambda物件的函式呼叫運算子,則發生未定義行為。c++ 的閉包並不延長**獲的引用的生存期。這同樣適用於**獲的this指標所指向的物件的生存期。lambda形參列表和一般的函式形參列表類似,但不允許預設實參(c++14 前)。當以 auto 為形參型別時,該 lambda 為泛型 lambda(c++14 起)。與乙個普通函式呼叫類似,呼叫乙個lambda時給定的實參被用來初始化lambda的形參。
//**在vs2019中測試
void func()
; f(i,j);
//輸出:1 20
std::cout << i << " " << j << std::endl;
}
//**在vs2019中測試
void func()
; f(1.5, 2);
f(true);
}
允許以下說明符:
預設情況下,對於乙個值被拷貝的變數,lambda不會改變其值。假如我們希望能改變乙個**獲的變數的值,就必須在引數列表後面加上關鍵字mutable。而乙個引用捕獲的變數則不受此限制。
//**在vs2019中測試
void func()
; i = 0, j = 0;
f();
//輸出:0 100
std::cout << i << " " << j << std::endl;
}
當我們需要為乙個lambda定義返回型別時,需要使用尾置返回型別。返回型別若預設,則根據函式體中的 return 語句進行推斷(如果有多條return語句,需要保證型別一直,否則編譯器無法自動推斷)。預設情況下,如果乙個lambda函式體不包含return語句,則編譯器假定返回void。
void func()
; std::cout << f() << std::endl;
}
如果不顯示指定返回型別,則int和double兩種返回型別會導致推斷衝突。
略,同普通函式的函式體。
#include #include #include #include int main()
; int x = 5;
c.erase(std::remove_if(c.begin(), c.end(), [x](int n) ), c.end());
std::cout << "c: ";
std::for_each(c.begin(), c.end(), (int i) );
std::cout << '\n';
// 閉包的型別不能被指名,但可用 auto 提及
// c++14 起,lambda 能擁有自身的預設實參
auto func1 = (int i = 6) ;
std::cout << "func1: " << func1() << '\n';
// 與所有可呼叫物件相同,閉包能可以**獲到 std::function 之中
// (這可能帶來不必要的開銷)
std::functionfunc2 = (int i) ;
std::cout << "func2: " << func2(6) << '\n';
system("pause");
return 0;
}
輸出:
C Lambda表示式基本用法
建立乙個匿名函式並執行。objective c採用的是上尖號 而c 11採用的是配對的方括號。例項如下 include using namespace std int main 我們也可以方便的將這個建立的匿名函式賦值出來呼叫 include using namespace std int main...
lambda表示式 C Lambda表示式
lambda宣告 lambda introducer。在內部,你可以指明乙個capture用來處理外部作用域內未被傳遞為實參的資料。意味著外部作用域以by value的方式傳遞給lambda。在lamdba中不能改變其值 為什麼?意味著外部作用域以by reference的方式傳遞給lambda。因...
C lambda表示式複習
include include include include using namespace std int main lambda表示式也就是乙個函式,我們可以把它賦給函式指標,也可以在後面加上括號使用。裡面可以新增一些限制lambda塊語句中使用外部變數的限制符。一共有四種情況 1.空白表示不...