Heim >Backend-Entwicklung >C++ >Warum schlagen rekursive Lambda-Funktionen mit der automatischen Typinferenz in C fehl?
Rekursive Lambda-Funktionen und Typinferenz
Betrachten Sie die folgende rekursive 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 schlägt fehl Kompilieren mit folgendem Fehler:
error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function
Das Problem ist auf die Verwendung von „Auto“ zurückzuführen um den Typ der Lambda-Funktion abzuleiten. Wenn auto verwendet wird, versucht der Compiler, den Typ aus dem Initialisierungsausdruck abzuleiten. Allerdings muss in diesem Fall der Initialisierungsausdruck selbst den Typ kennen, den er erfasst, wodurch eine zirkuläre Abhängigkeit entsteht.
Um dieses Problem zu lösen, kann man stattdessen den Typ eines vollständig spezifizierten Funktionsobjekts verwenden:
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 muss der Compiler nicht auf den Typ des Lambda-Abschlusses schließen, und das Lambda kann vollständig über die Typen informiert werden, um die es sich handelt Erfassung.
Obwohl rekursive Lambda-Funktionen mit Typinferenz arbeiten können, wird dies im Allgemeinen nicht empfohlen, da es zu Kompilierungsproblemen führen kann. Stattdessen stellt die explizite Angabe des Typs sicher, dass der Compiler zum Zeitpunkt der Kompilierung über alle erforderlichen Informationen verfügt.
Das obige ist der detaillierte Inhalt vonWarum schlagen rekursive Lambda-Funktionen mit der automatischen Typinferenz in C fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!