您的位置:首頁>正文

“什麼樣的程式設計語言,真正經得起時候考驗”,看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

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示