lambda函数的类型[复制](Type of lambda function [duplicate

2019-07-21 04:37发布

这个问题已经在这里有一个答案:

  • 当与C ++ 11“自动”推导出什么是拉姆达的类型? 6个回答

有这样的代码:

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

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

Answer 1:

§5.1.2/ 3的状态:

类型的λ-表达的(也是封闭的对象的类型)是一个独特的,无名不愈合类类型

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

顺便说一句,你的拉姆达的源码形式为main::$_0



Answer 2:

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

类型的λ-表达的(也是封闭的对象的类型)是一个独特的,无名不愈合CLASSTYPE -称为闭合类型-其特性如下所述。 这个类型不是汇总(8.5.1)。 封闭件类型是在最小的块范围,类范围,或命名空间中包含对应λ-表达范围中声明。

它接着列出确切属性闭合类型应该有。

因此没有一般类型lambda函数有。 编译器将生成未指定的名称为每个拉姆达功能的新仿函数类型



Answer 3:

什么是lambda表达式的类型?

类型lambda表达式(所谓的封闭 )的是一个未命名的类型与由编译器自动生成的函数调用操作。 内部名称编译器会给出它是不确定的。

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

类型的λ-表达的(也是封闭的对象的类型)是一个唯一的, 不连无名类类型 -称为闭合类型-其特性如下所述。 这个类型不是汇总(8.5.1)。 封闭件类型是在最小的块范围,类范围,或命名空间中包含对应λ-表达范围中声明。 [...]

另请注意,该name()的成员函数type_info类(由返回的类型typeid()也依赖于实现,且标准不要求它是有意义的人。

每个段落18.7.1:

const char* name() const noexcept;

9 返回实现定义 NTBS。

10 备注 :该消息可以是一个空终止多字节字符串(17.5.2.1.4.2),适合的转换与显示作为wstring的(21.3,22.4.1.4)



文章来源: Type of lambda function [duplicate]