재귀적 람다 함수 및 유형 추론
다음 재귀적 람다 함수를 고려하세요.
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를 사용하여 람다 함수 유형을 추론하는 데서 발생합니다. 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); };
이 경우 컴파일러는 람다 클로저의 유형을 추론할 필요가 없으며 람다는 해당 유형에 대해 완전히 알 수 있습니다.
재귀적 람다 함수는 유형 추론과 함께 작동할 수 있지만 일반적으로 컴파일 문제가 발생할 수 있으므로 권장되지 않습니다. 대신 유형을 명시적으로 지정하면 컴파일 시 컴파일러가 필요한 모든 정보를 갖게 됩니다.
위 내용은 C에서 자동 유형 추론으로 재귀 Lambda 함수가 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!