首页 >后端开发 >C++ >为什么 C 中的递归 Lambda 函数因自动类型推断而失败?

为什么 C 中的递归 Lambda 函数因自动类型推断而失败?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-16 17:57:11243浏览

Why Do Recursive Lambda Functions Fail with Auto Type Inference in C  ?

递归 Lambda 函数和类型推断

考虑以下递归 lambda 函数:

auto sum = [term,next,&sum](int a, int b)mutable ->int {
  if(a>b)
    return 0;
  else
    return term(a) + sum(next(a),b);
};

此代码无法使用以下内容进行编译错误:

error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function

问题源于使用 auto 来推断 lambda 函数的类型。使用 auto 时,编译器会尝试从初始化表达式推断类型。然而,在这种情况下,初始化表达式本身需要知道它捕获的类型,从而创建循环依赖关系。

要解决此问题,可以使用完全指定的函数对象的类型:

std::function<int(int,int)> sum = [term,next,&amp;sum](int a, int b)->int {
   if(a>b)
     return 0;
   else
     return term(a) + sum(next(a),b);
};

在这种情况下,编译器不需要推断 lambda 闭包的类型,并且 lambda 可以完全获知它的类型

虽然递归 lambda 函数可以与类型推断一起使用,但通常不建议这样做,因为它可能会导致编译问题。相反,显式指定类型可确保编译器在编译时拥有所有必要的信息。

以上是为什么 C 中的递归 Lambda 函数因自动类型推断而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

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