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