Heim >Backend-Entwicklung >C++ >Warum schlägt eine rekursive Lambda-Funktion mit „auto' fehl, ist aber mit einem vollständig angegebenen Typ erfolgreich?
Rekursive Lambda-Funktion mit Auto
Beim Versuch, eine rekursive Lambda-Funktion mit dem Schlüsselwort auto zu definieren, können Kompilierungsfehler auftreten. Betrachten Sie beispielsweise die folgende Lambda-Funktion:
auto sum = [term, next, &sum](int a, int b)mutable ->int { if(a>b) return 0; else return term(a) + sum(next(a),b); };
Dieser Code führt zu folgendem Fehler:
error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function
Das Problem verstehen
Das Problem entsteht, weil das Schlüsselwort auto den Typ der Lambda-Funktion aus ihrer Initialisierung ableitet. Für eine rekursive Lambda-Funktion muss der Lambda-Abschluss jedoch die Typen kennen, die er erfasst, was ein Henne-Ei-Problem darstellt.
Lösung: Verwendung eines vollständig spezifizierten Typs
Um dieses Problem zu beheben, können Sie den Typ der Lambda-Funktion explizit mithilfe eines std::function-Objekts angeben. Zum Beispiel:
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 diesem Fall wird der Typ der Lambda-Funktion vollständig angegeben, sodass der Lambda-Abschluss vollständig über die Typen informiert werden kann, die er erfasst.
Auto vs. vollständig spezifizierter Typ
Rekursive Lambda-Funktionen sind mit vollständig spezifizierten Typen kompatibel, jedoch nicht mit der Typinferenz mithilfe von Auto. Dies liegt daran, dass Auto erfordert, dass die Initialisierung einen bekannten Typ hat, während ein vollständig spezifizierter Typ dieses Wissen nicht erfordert.
Durch die explizite Angabe des Typs Ihrer rekursiven Lambda-Funktion können Sie Kompilierungsfehler vermeiden und sicherstellen, dass die Der Lambda-Verschluss ist korrekt über die Typen informiert, die er erfasst.
Das obige ist der detaillierte Inhalt vonWarum schlägt eine rekursive Lambda-Funktion mit „auto' fehl, ist aber mit einem vollständig angegebenen Typ erfolgreich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!