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中文网其他相关文章!