Heim >Backend-Entwicklung >C++ >Warum erfordert eine rekursive Lambda-Funktion in C 0x eine explizite Typdeklaration?

Warum erfordert eine rekursive Lambda-Funktion in C 0x eine explizite Typdeklaration?

Susan Sarandon
Susan SarandonOriginal
2024-12-14 10:39:15930Durchsuche

Why Does a Recursive Lambda Function in C  0x Require Explicit Type Declaration?

Rekursive Lambda-Funktionen in C 0x

Fehler und Lösung

Beim Versuch, ein rekursives Lambda zu erstellen, ist bei der Verwendung von Auto ein Fehler aufgetreten Schlüsselwort, um den Typ des Lambda abzuleiten. Wenn Sie jedoch den Typ des Lambda explizit als std::function deklariert haben, wurde der Code erfolgreich kompiliert.

Begründung

Automatische Typinferenz:

Bei Verwendung von „auto“ leitet der Compiler den Typ des Lambda basierend auf seiner Initialisierung ab. Bei einem rekursiven Lambda muss der Lambda-Abschluss jedoch die Typen kennen, die er erfasst (in diesem Fall sum). Dadurch entsteht eine zirkuläre Abhängigkeit, da der Typ des Lambda vom Typ seines Abschlusses abhängt, der wiederum vom Typ des Lambda abhängt.

Explizite Typdeklaration:

Den Typ des Lambda als std::function deklarieren behebt dieses Problem, da das Funktionsobjekt selbst nichts darüber „wissen“ muss, was ihm zugewiesen wird. Dadurch kann der Lambda-Abschluss die entsprechenden Typen erfassen, ohne auf Typinferenz angewiesen zu sein.

Rekursive Funktion:

Das überarbeitete Codesegment:

std::function<int(int, int)> sum;

sum = [term, next, &amp;sum](int a, int b) -> int {
    if (a > b)
        return 0;
    else
        return term(a) + sum(next(a), b);
};

zeigt, dass rekursive Lambda-Funktionen in C 0x vollkommen realisierbar sind. Sie erfordern lediglich eine explizite Typdeklaration, um das Problem der Typinferenz zu lösen.

Das obige ist der detaillierte Inhalt vonWarum erfordert eine rekursive Lambda-Funktion in C 0x eine explizite Typdeklaration?. 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