C 中的递归 Lambda 函数:编译困境
在设计递归 lambda 函数时,您可能会遇到编译错误。让我们深入研究当前的问题并探索其解决方案。
提供的 lambda 函数 sum 会在一系列值上累积数学运算项的结果。为了使其递归,您尝试通过引用捕获 lambda 之和:[term, next, &sum](int a, int b)。
但是,这种方法会导致编译错误。这是由使用 auto 声明的 lambda 函数与完全指定类型的 lambda 函数之间的根本区别引起的。
使用 auto 推断的 Lambda 函数从其初始化中派生出其类型。但是,在创建递归 lambda 时,lambda 还没有自己的类型。这会产生冲突:lambda 的闭包需要知道其类型,但尚未确定它。
要解决此问题,请使用 std::function
修改后的代码:
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中文网其他相关文章!