scd*_*dmb 9 c++ lambda typeid c++11
有这个代码:
auto fun = [](int x)->int {return x + 1; };
std::cout << typeid(fun).name() << std::endl;
Run Code Online (Sandbox Code Playgroud)
结果是:Z4mainEUliE_但c ++ filt似乎没有解释它是什么.什么是lambda表达式?
Lil*_*ard 12
§5.1.2/ 3指出:
的类型的λ-表达(这也是封闭的对象的类型)是一个独特的,无名不愈合类类型
它继续说更多,但这是最重要的一点.lambda基本上是匿名类的一个实例.
顺便说一下,你的lambda的解码形式是main::$_0.
标准(第5.1.2节)未指定lambda函数的类型:
lambda表达式的类型(也是闭包对象的类型)是一个唯一的,未命名的非联合classtype - 称为闭包类型 - 其属性如下所述.此类类型不是聚合(8.5.1).闭包类型在包含相应lambda表达式的最小块作用域,类作用域或命名空间作用域中声明.
然后继续列出闭包类型应具有的确切属性.
因此,lambda函数没有通用类型.编译器将为每个lambda函数生成一个带有未指定名称的新仿函数类型
什么是lambda表达式?
lambda表达式的类型(所谓的闭包)是一个未命名的类类型,它具有由编译器自动生成的函数调用操作符.编译器将给出的内部名称未指定.
根据C++ 11标准的第5.1.2/3段:
lambda-expression的类型(也是闭包对象的类型)是一个唯一的,未命名的nonunion类类型 - 称为闭包类型 - 其属性如下所述.此类类型不是聚合(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)