首页 >后端开发 >C++ >为什么 C 11 Lambda 表达式的'auto”推导与其函数指针类型不同?

为什么 C 11 Lambda 表达式的'auto”推导与其函数指针类型不同?

Barbara Streisand
Barbara Streisand原创
2024-12-24 17:57:19375浏览

Why Does `auto` Deduction of a C  11 Lambda Expression Differ from its Function Pointer Type?

C 11 中的 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 表达式分配给函数指针和 auto 变量。然而,比较它们类型的断言失败了。这就提出了一个问题:使用 auto 推导时 lambda 表达式的真实类型是什么?

与预期不同的是,lambda 表达式本身并不具有函数指针类型。相反,它们转换为函子对象。 [] 括号内的任何内容都将成为构造函数参数和函子成员,而 () 内的参数则成为函子的运算符 () 参数。

不捕获变量的 Lambda 表达式(空 [] 括号)可以转换为函数指针。然而,lambda 本身的底层类型仍然是函子类型,它不一定与函数指针相同。

因此,代码片段中的断言失败,因为 pFptr 的类型是函数指针,而 pAuto 的类型是 lambda 表达式生成的函子类型。

以上是为什么 C 11 Lambda 表达式的'auto”推导与其函数指针类型不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

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