有这个代码:
auto fun = [](int x)->int {return x + 1; };
std::cout << typeid(fun).name() << std::endl;
结果是:Z4mainEUliE_
但是 c++filt 似乎没有解释它是什么。什么是 lambda 表达式?
§5.1.2/3 规定:
lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型
它继续说更多,但这是最重要的一点。lambda 基本上是匿名类的一个实例。
顺便说一句,您的 lambda 的解构形式是main::$_0
.
标准未指定 lambda 函数的类型(第 5.1.2 节):
lambda 表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类类型——称为闭包类型——其属性如下所述。此类类型不是聚合 (8.5.1)。闭包类型在包含相应 lambda 表达式的最小块作用域、类作用域或命名空间作用域中声明。
然后它继续列出闭包类型应该具有的确切属性。
因此,lambda 函数没有通用类型。编译器将为每个 lambda 函数生成一个具有未指定名称的新函子类型
什么是 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)