使用 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,&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中文网其他相关文章!