首页 >后端开发 >C++ >C 14 中的通用 Lambda 是如何工作的?

C 14 中的通用 Lambda 是如何工作的?

Susan Sarandon
Susan Sarandon原创
2024-12-06 00:53:11141浏览

How Do Generic Lambdas in C  14 Work?

理解 C 14 中的泛型 Lambda

在 C 14 中引入,泛型 lambda 提供了一种编写可对任意值进行操作的 lambda 表达式的方法类型。然而,问题出现了:这个机制是如何发挥作用的?

通用 Lambda 的实现

与 C 11 中的常规 lambda 不同,通用 lambda 在其内部使用模板化调用运算符闭合类型。当 [auto](https://en.cppreference.com/w/cpp/keyword/auto) 关键字出现在参数列表中时,编译器会生成模板化调用运算符,而不是标准调用运算符。

示例:

auto glambda = [](auto a) { return a; };

此代码通过以下调用生成闭包类型运算符:

class /* unnamed */
{
public:
    template<typename T>
    T operator () (T a) const { return a; }
};

标准定义

根据 C 14 标准草案 n3690 的第 5.1.2/5 段,泛型 lambda 闭包类型的调用运算符具有以下属性:

  • 每次出现参数列表中的[auto](https://en.cppreference.com/w/cpp/keyword/auto)对应的是一个发明的类型模板参数。
  • 调用运算符的返回类型和函数参数是派生的通过将每个 [auto](https://en.cppreference.com/w/cpp/keyword/auto) 替换为发明的模板参数的 lambda 的尾随返回类型和参数声明子句name.

与 C 模板与 Java 泛型的相似性

泛型 lambda 与 C 模板类似,因为编译器会根据不同的参数类型生成独特的函数在模板参数上。但是,它们与 Java 泛型不同,后者在运行时利用类型擦除来在编译时维护类型信息。另一方面,泛型 lambda 可以创建具有显式类型的静态专用闭包。

以上是C 14 中的通用 Lambda 是如何工作的?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn