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

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

Susan Sarandon
发布: 2024-12-10 10:06:12
原创
284 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板