我有一种感觉,lambda 的类型是函数指针。当我执行以下测试时,我发现它是错误的(演示)。
#define LAMBDA [] (int i) -> long { return 0; } int main () { long (*pFptr)(int) = LAMBDA; // ok auto pAuto = LAMBDA; // ok assert(typeid(pFptr) == typeid(pAuto)); // assertion fails ! }
上面的代码是否缺少任何要点?如果不是,那么用关键字typeof推导时的 lambda 表达式是什么?auto
typeof
auto
未指定 lambda 表达式的类型。
但它们通常只是函子的语法糖。一个 lambda 被直接翻译成一个仿函数。里面的任何东西[]都变成了构造函数参数和仿函数对象的成员,里面的参数()变成了仿函数的参数operator()。
[]
()
operator()
可以将不捕获任何变量(在[]‘s 内没有任何内容)的 lambda 转换 为函数指针(如果那是您的编译器,MSVC2010 不支持此功能,但此转换是标准的一部分)。
但是 lambda 的实际类型不是函数指针。这是一些未指定的函子类型。