首页 >后端开发 >C++ >为什么递归 Lambda 函数在使用'auto”时会失败,但在使用完全指定的类型时会成功?

为什么递归 Lambda 函数在使用'auto”时会失败,但在使用完全指定的类型时会成功?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-14 21:39:16626浏览

Why Does a Recursive Lambda Function Fail with `auto` but Succeed with a Fully Specified Type?

使用 Auto 的递归 Lambda 函数

尝试使用 auto 关键字定义递归 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 函数的初始化中推断出其类型。然而,对于递归 lambda 函数,lambda 闭包需要知道它捕获的类型,这是一个先有鸡还是先有蛋的问题。

解决方案:使用完全指定的类型

要解决此问题,您可以使用 std::function 对象显式指定 lambda 函数的类型。例如:

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 闭包可以完全了解其捕获的类型。

Auto与完全指定类型

递归 lambda 函数与完全指定类型兼容,但与使用的类型推断不兼容 汽车。这是因为 auto 要求初始化具有已知的类型,而完全指定的类型则不需要此知识。

通过显式指定递归 lambda 函数的类型,可以避免编译错误并确保lambda 闭包被正确告知其捕获的类型。

以上是为什么递归 Lambda 函数在使用'auto”时会失败,但在使用完全指定的类型时会成功?的详细内容。更多信息请关注PHP中文网其他相关文章!

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