小编典典

在 C++11 中用“auto”推导时 lambda 的类型是什么?

all

我有一种感觉,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 !
}

上面的代码是否缺少任何要点?如果不是,那么用关键字typeof推导时的 lambda 表达式是什么?auto


阅读 98

收藏
2022-08-27

共1个答案

小编典典

未指定 lambda 表达式的类型。

但它们通常只是函子的语法糖。一个 lambda
被直接翻译成一个仿函数。里面的任何东西[]都变成了构造函数参数和仿函数对象的成员,里面的参数()变成了仿函数的参数operator()

可以将不捕获任何变量(在[]‘s 内没有任何内容)的 lambda 转换 为函数指针(如果那是您的编译器,MSVC2010
不支持此功能,但此转换是标准的一部分)。

但是 lambda 的实际类型不是函数指针。这是一些未指定的函子类型。

2022-08-27