Home >Backend Development >C++ >Why Does a Recursive Lambda Function Fail with `auto` but Succeed with a Fully Specified Type?
Recursive Lambda Function with Auto
When attempting to define a recursive lambda function using the auto keyword, you may encounter compilation errors. For instance, consider the following lambda function:
auto sum = [term, next, &sum](int a, int b)mutable ->int { if(a>b) return 0; else return term(a) + sum(next(a),b); };
This code will result in the following error:
error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function
Understanding the Issue
The issue arises because the auto keyword infers the type of the lambda function from its initialization. However, for a recursive lambda function, the lambda closure needs to know the types it's capturing, which is a chicken-and-egg problem.
Solution: Using a Fully Specified Type
To resolve this issue, you can specify the type of the lambda function explicitly using a std::function object. For example:
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); };
In this case, the type of the lambda function is fully specified, so the lambda closure can be fully informed about the types it's capturing.
Auto vs. Fully Specified Type
Recursive lambda functions are compatible with fully specified types but not with type inference using auto. This is because auto requires the initialization to have a known type, while a fully specified type does not require this knowledge.
By explicitly specifying the type of your recursive lambda function, you can avoid compilation errors and ensure that the lambda closure is correctly informed about the types it's capturing.
The above is the detailed content of Why Does a Recursive Lambda Function Fail with `auto` but Succeed with a Fully Specified Type?. For more information, please follow other related articles on the PHP Chinese website!