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