更多學習資料, 更多學習視頻, 免費課程 編譯器 :C/C++ 8群 491994603
標準C ++ 14使C ++ 11更完整, 因為C ++ 11有很多缺陷。 C ++ 14不僅修改了C ++ 11, 還提出了許多新功能, 其中最引人注目的是對lambda運算式的補充。
更多學習資料, 更多學習視頻, 免費課程 編譯器 :C/C++ 8群 491994603
第一個補充稱為“廣義λ捕獲”, 來自提案N3610和N3648。 這項補充措施最初被提出用於抓捕。
int x = 4;
auto y = [&r = x, x = x + 1]() - > int {
r + = 2;
返回x + 2;
}(); //更新:: x到6, 並將y初始化為7。
在這個例子中, 你可以在捕獲清單中找到兩個變數r和x。 變數r通過引用捕獲, 並用x的值初始化。 但是, r不在lambda運算式的父範圍內聲明, 這在C ++ 11中是不允許的。 在C ++ 14中, 它的類型由其初始設定式推導出來。 這裡, r是x的左值引用。 另一個變數x在lambda運算式的父範圍內聲明, 並且由值捕獲並以x + 1的值初始化, 因此在父範圍中不一樣。 lambda運算式中x的初始值為5.調用上述lambda運算式後, 我們可以得到x和y的最終結果, 分別為6和7。
編譯器通過將它們轉換為函數物件來實現lambda運算式。 為了幫助您更好地瞭解lambda運算式的這一新功能,
lambda的另一個補充稱為來自N3559和N3649的“通用lambda”。 在C ++ 14中, 自動類型說明符可以是用於標識通用lambda運算式的lambda參數的說明符。 請參見以下示例:
auto Identity = [](auto a){return a; };
int three = Identity(3);
char const * hello = Identity(“hello”);
在這個例子中, 我們定義一個通用的lambda運算式, 並使用閉包物件初始化Identity。 在實現中, 編譯器將此通用lambda運算式轉換為以下函數物件:
範本
類lambda {
上市:
T運算子(T t){return t; }
};
當函數Identity(3)被調用時, 通用的lambda運算式被初始化為參數類型為int的lambda運算式。 當調用Identity(“hello”)時, 通用lambda運算式被初始化為其參數類型為const char *。 通用lambda運算式用作函數範本。
沒有捕獲列表的通用λ-運算式可被轉換到一個POIN 三- 以-f UNCT 離子。 當指標到函數被調用時, 它具有與調用通用lambda運算式相同的效果。
auto Identity = [](auto a){return a; };
int(* fpi)(int)= Identity;
在這兩種C ++ 11和C ++ 14, 如果λ-表達具有捕獲列表, 它不能被轉換成POIN 三- 以-f UNCT 離子。 這是一個lambda運算式和傳統函數之間的巨大區別:前者可以具有初始狀態, 後者不能。
更多學習資料, 更多學習視頻, 免費課程 編譯器 :C/C++ 8群 491994603