C 11 中使用“auto”进行 Lambda 类型推断
C 11 中 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 ! }
此代码与 lambda 具有函数指针类型的假设相矛盾。那么,它们类型的真实本质是什么?
揭开 Lambda 的真实身份
与普遍看法相反,lambda 表达式具有未指定的类型。它们只是函子的语法便利。在编译过程中,lambda 会转换为函子:
没有变量捕获(空 [] 括号)的 Lambda 在技术上可以是转换为函数指针。然而,并非所有编译器(例如 MSVC2010)都支持这种转换。
重要区别
虽然不捕获任何变量的 lambda 可以充当函数指针,其基础类型仍未指定。它不是函数指针,而是未指定的函子类型。
以上是C 11 Lambda 表达式的真实类型是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!