首页 >后端开发 >C++ >为什么 C 中的递归 Lambda 函数会导致编译错误以及如何解决?

为什么 C 中的递归 Lambda 函数会导致编译错误以及如何解决?

Barbara Streisand
Barbara Streisand原创
2024-12-19 18:23:09591浏览

Why Do Recursive Lambda Functions in C   Cause Compilation Errors, and How Can They Be Resolved?

C 中的递归 Lambda 函数:编译困境

在设计递归 lambda 函数时,您可能会遇到编译错误。让我们深入研究当前的问题并探索其解决方案。

提供的 lambda 函数 sum 会在一系列值上累积数学运算项的结果。为了使其递归,您尝试通过引用捕获 lambda 之和:[term, next, &sum](int a, int b)。

但是,这种方法会导致编译错误。这是由使用 auto 声明的 lambda 函数与完全指定类型的 lambda 函数之间的根本区别引起的。

使用 auto 推断的 Lambda 函数从其初始化中派生出其类型。但是,在创建递归 lambda 时,lambda 还没有自己的类型。这会产生冲突:lambda 的闭包需要知道其类型,但尚未确定它。

要解决此问题,请使用 std::function 显式定义 lambda 的类型;.这使得 lambda 的闭包拥有完整的类型信息,使其能够通过引用捕获 lambda 之和。

修改后的代码:

std::function<int(int, int)> sum;

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

此修改为编译器提供了必要的类型信息,允许递归 lambda 函数按预期编译和执行。

以上是为什么 C 中的递归 Lambda 函数会导致编译错误以及如何解决?的详细内容。更多信息请关注PHP中文网其他相关文章!

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