通用 lambda 在 C 14 中如何工作?

新手上路,请多包涵

通用 lambda 在 C++14 标准中如何工作( auto 关键字作为参数类型)?

它是基于 C++ 模板,其中为每个不同的参数类型编译器生成一个具有相同主体但替换类型的新函数(编译时多态性)还是更类似于 Java 的泛型(类型擦除)?

代码示例:

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

原文由 sasha.sochka 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 416
1 个回答

C++14 中引入了通用 lambda。

简单地说,由 lambda 表达式定义的闭包类型将有一个 模板化 调用运算符,而不是 C++11 的 lambdas 的常规、非模板调用运算符(当然,当出现 auto 在参数列表中至少出现一次)。

所以你的例子:

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

将使 glambda 这种类型的实例:

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

C++14 标准草案 n3690 的第 5.1.25 段指定了如何定义给定 lambda 表达式的闭包类型的调用运算符:

非泛型 lambda 表达式的闭包类型具有公共内联函数调用运算符 (13.5.4),其参数和返回类型分别由 lambda 表达式的参数声明子句和尾随返回类型描述。 对于通用 lambda,闭包类型有一个公共内联函数调用运算符成员模板 (14.5.2),其模板参数列表由一个发明的类型模板参数组成,用于 lambda 的参数声明子句中每次出现的 auto,按外观顺序。如果相应的参数声明声明了函数参数包(8.3.5),则发明的类型模板参数是参数包。函数调用运算符模板的返回类型和函数参数派生自 lambda-expression 的 trailing-return-type 和 parameter-declarationclause,方法是将 parameter-declaration-clause 的 decl-specifiers 中每次出现的 auto 替换为 name相应的发明模板参数。

最后:

它是否类似于模板,其中为每个不同的参数类型编译器生成具有相同主体但类型更改的函数,还是更类似于 Java 的泛型?

如上段所述,通用 lambda 只是具有模板化调用运算符的独特、未命名仿函数的语法糖。那应该回答你的问题:)

原文由 Andy Prowl 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题