3 回答
TA贡献1804条经验 获得超2个赞
lambda表达式的类型未指定。
但它们通常仅仅是仿函数的语法糖。lambda直接转换为仿函数。里面的任何东西[]
都变成了构造函数参数和仿函数对象的成员,里面的参数()
变成了仿函数的参数operator()
。
一个没有变量的lambda(在[]
s 里面没有任何东西)可以转换成一个函数指针(MSVC2010不支持这个,如果那是你的编译器,但这个转换是标准的一部分)。
但是lambda的实际类型不是函数指针。这是一些未指定的仿函数类型。
TA贡献1811条经验 获得超6个赞
它是一个唯一的未命名结构,它使函数调用运算符重载。lambda的每个实例都引入了一种新类型。
在非捕获lambda的特殊情况下,该结构还具有对函数指针的隐式转换。
TA贡献1777条经验 获得超3个赞
[C++11: 5.1.2/3]:
的类型的λ-表达(这也是封闭的对象的类型)是一个独特的,无名不愈合类类型 -称为闭合类型 -其特性如下所述。此类类型不是聚合(8.5.1)。闭包类型在包含相应lambda表达式的最小块作用域,类作用域或命名空间作用域中声明。[..]
该子句继续列出此类型的不同属性。以下是一些亮点:
[C++11: 5.1.2/5]:
lambda表达式的闭包类型有一个公共inline
函数调用操作符(13.5.4),其参数和返回类型分别由lambda-expression的parameter-declaration-clause和trailing-return-type描述。[..]
[C++11: 5.1.2/6]:
没有lambda-capture的lambda表达式的闭包类型有一个公共的非虚拟非显式const转换函数,用于指向具有与闭包类型的函数调用操作符相同的参数和返回类型的函数。此转换函数返回的值应为函数的地址,该函数在调用时与调用闭包类型的函数调用运算符具有相同的效果。
最后一段话的结果是,如果您使用转换,您将可以分配LAMBDA
给pFptr
。
- 3 回答
- 0 关注
- 802 浏览
添加回答
举报