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

新手上路,请多包涵

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

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

原文由 iammilind 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 746
2 个回答

未指定 lambda 表达式的类型。

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

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

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

原文由 jalf 发布,翻译遵循 CC BY-SA 3.0 许可协议

进一步完善 jalf 的回答

不捕获任何变量([] 中没有任何内容)的 lambda 可以转换为函数指针

例如:

   typedef int (*Foo)(int a);

  auto bar = [](int a){
    return a;
  };

  int tmp = 1;

  auto bar2 = [tmp](int a){
    return a+tmp;
  };

  Foo foo = bar; // this is ok
  Foo foo2 = bar2; // this gives C/C++(413)

原文由 numan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题