首页 >后端开发 >C++ >C 11 Lambda 表达式的真实类型是什么?

C 11 Lambda 表达式的真实类型是什么?

Susan Sarandon
Susan Sarandon原创
2024-12-10 10:06:12285浏览

What is the True Type of a C  11 Lambda Expression?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn