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