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