下面是这段代码:
auto fun = [](int x)->int {return x + 1; };
std::cout << typeid(fun).name() << std::endl;结果是:Z4mainEUliE_,但c++filt似乎没有解释它是什么。lambda表达式的类型是什么?
发布于 2013-03-08 03:07:23
§5.1.2/3说明:
表达式的类型(也是闭包对象的类型)是唯一的、未命名的非并集类类型
它接着说了更多,但这是最重要的一点。lambda基本上是一个匿名类的实例。
顺便说一下,您的lambda的变形形式是main::$_0。
发布于 2013-03-08 03:07:20
lambda函数的类型未在标准中指定(§5.1.2):
表达式的类型(也是闭包对象的类型)是唯一的、未命名的非并集类类型-称为闭包类型-其属性如下所述。此类类型不是聚合(8.5.1)。闭包类型在包含相应lambda表达式的最小块作用域、类作用域或命名空间作用域中声明。
然后,它继续列出闭包类型应该具有的确切属性。
因此,lambda函数没有通用的类型。编译器将为每个lambda函数生成一个新的functor类型,其名称未指定
发布于 2013-03-08 03:07:20
λ表达式的类型是什么?
拉姆达表达式的类型(所谓的闭包)是一种未命名的类类型,具有由编译器自动生成的函数调用运算符。编译器将为其指定的内部名称未指定。
根据C++11标准的第5.1.2/3段:
表达式的类型(也是闭包对象的类型)是唯一的、未命名的非并集类类型-称为闭包类型-其属性将在下面描述。此类类型不是聚合(8.5.1)。闭包类型在包含相应lambda表达式的最小块作用域、类作用域或命名空间作用域中声明。..。
还要注意,type_info类的name()成员函数(由typeid()返回的类型)也是依赖于实现的,标准并不要求它对人类有意义。
根据18.7.1段:
const char* name() const noexcept;
9返回:一个implementation-defined NTBS。
10备注:消息可能是以null结尾的多字节字符串(17.5.2.1.4.2),适合转换为wstring (21.3,22.4.1.4)
https://stackoverflow.com/questions/15279547
复制相似问题