Heim > Backend-Entwicklung > C++ > Warum schlagen rekursive Lambda-Funktionen mit der automatischen Typinferenz in C fehl?

Warum schlagen rekursive Lambda-Funktionen mit der automatischen Typinferenz in C fehl?

Mary-Kate Olsen
Freigeben: 2024-12-16 17:57:11
Original
238 Leute haben es durchsucht

Why Do Recursive Lambda Functions Fail with Auto Type Inference in C  ?

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);
};
Nach dem Login kopieren

Dieser Code schlägt fehl Kompilieren mit folgendem Fehler:

error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function
Nach dem Login kopieren

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,&amp;sum](int a, int b)->int {
   if(a>b)
     return 0;
   else
     return term(a) + sum(next(a),b);
};
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage