【问题标题】:Type of lambda function [duplicate]lambda函数的类型[重复]
【发布时间】:2013-02-23 03:28:18
【问题描述】:

有这个代码:

auto fun = [](int x)->int {return x + 1; };
std::cout << typeid(fun).name() << std::endl;

结果是:Z4mainEUliE_ 但 c++filt 似乎没有解释它是什么。什么是 lambda 表达式?

【问题讨论】:

  • c++filt -t 告诉我main::{lambda(int)#1}

标签: c++ c++11 lambda typeid


【解决方案1】:

§5.1.2/3 规定:

lambda-expression 的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型

它继续说更多,但这是最重要的一点。 lambda 基本上是匿名类的一个实例。

顺便说一句,您的 lambda 的解构形式是 main::$_0

【讨论】:

    【解决方案2】:

    标准未指定 lambda 函数的类型(第 5.1.2 节):

    lambda 表达式的类型(也是闭包对象的类型)是一个唯一的、未命名的非联合类类型——称为闭包类型——其属性如下所述。此类类型不是聚合 (8.5.1)。闭包类型在包含相应 lambda 表达式的最小块作用域、类作用域或命名空间作用域中声明。

    然后它继续列出闭包类型应该具有的确切属性。

    因此,lambda 函数没有通用类型。编译器将为每个 lambda 函数生成一个未指定名称的新函子类型

    【讨论】:

      【解决方案3】:

      什么是 lambda 表达式的类型?

      lambda 表达式的类型(所谓的closure)是一个未命名的类类型,带有一个由编译器自动生成的函数调用运算符。编译器将给它的内部名称是未指定的。

      根据 C++11 标准第 5.1.2/3 段:

      lambda 表达式的类型(也是闭包对象的类型)是唯一的,未命名的非联合 类类型——称为闭包类型——其属性如下所述。这个类类型不是 聚合(8.5.1)。闭包类型在最小的块作用域、类作用域或命名空间中声明 包含相应 lambda 表达式的作用域。 [...]

      另请注意,type_info 类的name() 成员函数(typeid() 返回的类型)也依赖于实现,标准不要求它对人类有意义。

      根据第 18.7.1 段:

      const char* name() const noexcept;

      9 返回:一个实现定义的 NTBS。

      10 备注:消息可能是以null结尾的多字节字符串(17.5.2.1.4.2),适合转换显示为wstring(21.3, 22.4.1.4)

      【讨论】:

        猜你喜欢
        • 2018-08-06
        • 1970-01-01
        • 2019-01-28
        • 2016-11-12
        • 2014-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多