在 C 14 中,泛型 lambda 的引入带来了代码灵活性的新维度。它们利用 auto 作为参数类型的强大功能,但它们的机制是否植根于 C 模板或类似 Java 的类型擦除?
通用 lambda 利用 C 模板来定义拥有模板化调用运算符的闭包类型。这与 C 11 lambda 中的非模板化调用运算符不同。考虑这个例子:
auto glambda = [](auto a) { return a; };
这里,glambda 的闭包类型定义如下:
class /* unnamed */ { public: template<typename T> T operator () (T a) const { return a; } };
泛型 lambda 共享与 C 模板相似,编译器为不同的参数类型生成不同的函数。然而,有一个关键的区别:泛型 lambda 不会在编译时创建多个函数实例。相反,它们采用单个未命名函子来定义模板化调用运算符。
与采用类型擦除的 Java 泛型相反,泛型 lambda 保留类型信息。调用运算符中的类型模板参数允许 lambda 在运行时推导和操作实际参数类型。
C 14 中的通用 lambda 是编写简洁灵活代码的强大工具。虽然它们从 C 模板中汲取灵感,但它们的机制明显不同,提供了编译时和运行时行为的独特混合。
以上是C 14 通用 Lambda 是基于模板还是类型擦除?的详细内容。更多信息请关注PHP中文网其他相关文章!