華文網

“什麼樣的程式設計語言,真正經得起時候考驗”,看C++14的Lambda

更多學習資料,更多學習視頻,免費課程 編譯器 :C/C++ 8群 491994603

標準C ++ 14使C ++ 11更完整,因為C ++ 11有很多缺陷。C ++ 14不僅修改了C ++ 11,還提出了許多新功能,其中最引人注目的是對lambda運算式的補充。Lambda運算式是C ++ 11中最有趣的功能,它挑戰了長期使用的定義函數的方法。C ++ 14提出了這個著名功能的兩個主要補充。

更多學習資料,更多學習視頻,免費課程 編譯器 :C/C++ 8群 491994603

第一個補充稱為“廣義λ捕獲”,來自提案N3610和N3648。這項補充措施最初被提出用於抓捕。除了這個新功能,補充還使得捕獲列表更加靈活。這個補充指出,運算式現在被允許出現在lambda運算式的捕獲列表中。請參見以下示例:

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運算式轉換為函數物件。

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