Heim >Backend-Entwicklung >C++ >Warum unterscheidet sich die „auto'-Ableitung eines C 11-Lambda-Ausdrucks von seinem Funktionszeigertyp?

Warum unterscheidet sich die „auto'-Ableitung eines C 11-Lambda-Ausdrucks von seinem Funktionszeigertyp?

Barbara Streisand
Barbara StreisandOriginal
2024-12-24 17:57:19375Durchsuche

Why Does `auto` Deduction of a C  11 Lambda Expression Differ from its Function Pointer Type?

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!

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