首页 >后端开发 >C++ >为什么 `auto` 不将 Lambda 表达式的类型推导为 C 11 中的函数指针?

为什么 `auto` 不将 Lambda 表达式的类型推导为 C 11 中的函数指针?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-08 03:59:09290浏览

Why Doesn't `auto` Deduce a Lambda Expression's Type as a Function Pointer in C  11?

揭秘 C 11 中“auto”的 Lambda 类型推导

在 C 11 领域,lambda 表达式的引入引发了一些问题关于使用“auto”关键字推导时的基础类型。事实证明,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!
}

此代码展示了函数指针和使用“auto”的 lambda 表达式之间的类型推导差异。 ” 关键字。有趣的是,断言失败了,这表明 lambda 的类型不是函数指针。

揭开 Lambda 类型的真实本质

要理解这个明显的悖论,至关重要的是要认识到 lambda 表达式的类型在 C 11 中仍未指定。它们作为语法结构无缝地转换为函子。在此转换中,方括号 ("[]") 内的元素将成为构造函数参数和类成员,而括号内的元素将成为仿函数运算符 () 的参数。

值得注意的是,没有变量捕获的 lambda (空方括号)具有转换为函数指针的能力,这是 MSVC2010 不支持的功能。然而,仍然需要强调的是,尽管这样的转换是可能的,但 lambda 的固有类型是一种独特的未指定函子类型。

结论

“auto” " 关键字为类型推导提供了便利,但辨别不同语言实体的底层类型至关重要。就 lambda 表达式而言,它们的未指定性质和转换为函数指针的潜力(如果适用)突出了 C 11 提供的灵活性,同时也强调了理解语言复杂细微差别的重要性。

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

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