9

有这个代码:

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

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

4

3 回答 3

13

§5.1.2/3 规定:

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

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

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

于 2013-03-07T19:07:22.650 回答
6

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

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

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

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

于 2013-03-07T19:07:19.537 回答
6

什么是 lambda 表达式?

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

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

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

还要注意,类的name()成员函数type_info(返回的类型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)

于 2013-03-07T19:07:20.253 回答