lambda函数的类型

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.


Gri*_*zly 6

标准(第5.1.2节)未指定lambda函数的类型:

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

然后继续列出闭包类型应具有的确切属性.

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


And*_*owl 6

什么是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)