Heim >Backend-Entwicklung >C++ >Was ist der wahre Typ eines C 11-Lambda-Ausdrucks?

Was ist der wahre Typ eines C 11-Lambda-Ausdrucks?

Susan Sarandon
Susan SarandonOriginal
2024-12-10 10:06:12285Durchsuche

What is the True Type of a C  11 Lambda Expression?

Lambda-Typ-Inferenz mit „auto“ in C 11

Der Typ eines Lambda-Ausdrucks in C 11 ist bei einigen umstritten Ich glaube, es handelt sich um einen Funktionszeiger. Betrachten Sie jedoch die folgende Demonstration:

#define LAMBDA [] (int i) -> long { return 0; }
int main()
{
    long (*pFptr)(int) = LAMBDA;  // ok
    auto pAuto = LAMBDA;  // ok
    assert(typeid(pFptr) == typeid(pAuto));  // assertion fails !
}

Dieser Code widerspricht der Annahme, dass Lambdas einen Funktionszeigertyp haben. Was ist also die wahre Natur ihres Typs?

Enthüllung der wahren Identität des Lambda

Entgegen der landläufigen Meinung haben Lambda-Ausdrücke einen nicht spezifizierten Typ. Sie sind lediglich syntaktische Erleichterungen für Funktoren. Während der Kompilierung verwandelt sich ein Lambda in einen Funktor:

  • Elemente in den []-Klammern werden zu Konstruktorparametern und Funktorobjektmitgliedern.
  • In () eingeschlossene Parameter werden in Parameter für umgewandelt Funktor-Operator().

Lambdas ohne Variablenerfassungen (leere []-Klammern) können technisch konvertiert werden in Funktionszeiger umwandeln. Diese Konvertierung wird jedoch nicht von allen Compilern unterstützt (z. B. MSVC2010).

Wichtiger Unterschied

Während ein Lambda, das keine Variablen erfasst, als Funktionszeiger fungieren kann, Der zugrunde liegende Typ bleibt unbekannt. Es handelt sich nicht um einen Funktionszeiger, sondern um einen nicht spezifizierten Funktortyp.

Das obige ist der detaillierte Inhalt vonWas ist der wahre Typ eines C 11-Lambda-Ausdrucks?. 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