Lambda-Ausdruckstypableitung in C 11
In C 11 sind Lambda-Ausdrücke vielseitige Werkzeuge zum Erstellen anonymer Funktionen. Der zugrunde liegende Mechanismus zur Typableitung ist jedoch möglicherweise nicht immer intuitiv.
Bedenken Sie den Codeausschnitt:
#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 ! }
Der Code weist einen Lambda-Ausdruck sowohl einem Funktionszeiger als auch einer automatischen Variablen zu. Die Behauptung, ihre Typen zu vergleichen, schlägt jedoch fehl. Dies wirft die Frage auf: Was ist der wahre Typ eines Lambda-Ausdrucks, wenn er mit „auto“ abgeleitet wird?
Anders als zu erwarten wäre, verfügen Lambda-Ausdrücke nicht von Natur aus über einen Funktionszeigertyp. Stattdessen werden sie in Funktorobjekte übersetzt. Alles innerhalb der []-Klammer wird zu Konstruktorargumenten und Funktor-Member, während Parameter in () zu den Operator()-Parametern des Funktors werden.
Lambda-Ausdrücke, die keine Variablen erfassen (leere []-Klammern), können in eine Funktion umgewandelt werden Hinweise. Der zugrunde liegende Typ des Lambda selbst bleibt jedoch ein Funktortyp, der nicht unbedingt mit einem Funktionszeiger identisch ist.
Daher schlägt die Behauptung im Codeausschnitt fehl, da der Typ von pFptr ein Funktionszeiger ist. während der Typ von pAuto der vom Lambda-Ausdruck generierte Funktortyp ist.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich die „auto'-Ableitung eines C 11-Lambda-Ausdrucks von seinem Funktionszeigertyp?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!