C 14 中的泛型Lambda:深入探究
C 14 中泛型性lambda 的出現為lambda 表達式引入了一項表達式新穎的功能,允許對於具有自動推導參數類型的函數。然而,這些泛型的工作機制一直受到猜測。
與最初的假設相反,泛型 lambda 不依賴 C 模板來實現。相反,它們遵循一種獨特的方法,涉及 lambda 閉包類型的模板化呼叫運算子。
例如,通用lambda 表達式:
auto glambda = [](auto a) { return a; };
產生具有下列內容的閉包型別模板化呼叫運算子:
class /* unnamed */ { public: template <typename T> T operator () (T a) const { return a; } };
呼叫運算子是基於為每個auto 實例發明的類型模板參數進行模板化的lambda 的參數聲明。這些參數使推導的類型能夠隨著 lambda 的每次呼叫而變化。
這種模板化方法與 C 模板不同,C 模板為每個唯一的參數類型產生新函數。相反,它的操作更像 Java 的泛型,其中底層類型擦除允許高效實現,而不需要專門的函數生成。
總之,C 14 中的泛型 lambda 使用模板化呼叫運算子而不是傳統的 C 模板。這種設計選擇在表達能力和最佳化之間取得了平衡,提供了一種使用自動推導參數類型的函數的便捷方法。
以上是C 14 泛型 Lambda 如何在沒有傳統範本的情況下實作類型推導?的詳細內容。更多資訊請關注PHP中文網其他相關文章!