理解 C 14 中 Auto 关键字的变体
在 C 14 中,泛型 lambda,一种带有 auto 关键字的 lambda 表达式参数类型,提供增强的灵活性。与具有非模板调用运算符的 C 11 lambda 相反,泛型 lambda 在其定义的闭包类型中具有模板化调用运算符。
例如,以下代码演示了泛型 lambda:
auto glambda = [](auto a) { return a; };
在这种情况下,glambda 的闭包类型将被定义为:
class /* unnamed */ { public: template<typename T> T operator () (T a) const { return a; } };
这意味着 glambda 是具有模板化调用运算符的唯一未命名仿函数的实例。 lambda 参数声明中每次出现的 auto 都对应于一个发明的类型模板参数,允许调用运算符处理不同类型的参数。
C 14 标准 (n3690) 指定闭包类型的调用运算符对于通用 lambda,它有一个模板参数列表,其中为 lambda 参数声明子句中的每个 auto 发明了一个类型模板参数。返回类型和函数参数源自 lambda 的尾随返回类型和参数声明子句,其中 auto 被相应发明的模板参数的名称替换。
总之,C 14 中的通用 lambda表示具有模板化调用运算符的唯一的、未命名的函子。这与基于 C 模板的多态性不同,在 C 模板中,编译器会为每个参数类型生成具有替换类型的新函数。它与 Java 的泛型更加一致,涉及编译期间的类型擦除。
以上是C 14 泛型 Lambda 如何使用'auto”关键字实现类型灵活性?的详细内容。更多信息请关注PHP中文网其他相关文章!