Heim >Backend-Entwicklung >C++ >Warum schlägt eine rekursive Lambda-Funktion mit „auto' fehl, ist aber mit einem vollständig angegebenen Typ erfolgreich?

Warum schlägt eine rekursive Lambda-Funktion mit „auto' fehl, ist aber mit einem vollständig angegebenen Typ erfolgreich?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-14 21:39:16631Durchsuche

Why Does a Recursive Lambda Function Fail with `auto` but Succeed with a Fully Specified Type?

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,&amp;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!

Stellungnahme:
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