首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lambda函数的类型

lambda函数的类型
EN

Stack Overflow用户
提问于 2013-03-08 03:01:58
回答 3查看 908关注 0票数 9

下面是这段代码:

代码语言:javascript
复制
auto fun = [](int x)->int {return x + 1; };
std::cout << typeid(fun).name() << std::endl;

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-08 03:07:23

§5.1.2/3说明:

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

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

顺便说一下,您的lambda的变形形式是main::$_0

票数 13
EN

Stack Overflow用户

发布于 2013-03-08 03:07:20

lambda函数的类型未在标准中指定(§5.1.2):

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

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

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

票数 6
EN

Stack Overflow用户

发布于 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)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15279547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档