Heim >Backend-Entwicklung >C++ >Warum leitet „auto' den Typ eines Lambda-Ausdrucks nicht als Funktionszeiger in C 11 ab?

Warum leitet „auto' den Typ eines Lambda-Ausdrucks nicht als Funktionszeiger in C 11 ab?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-08 03:59:09292Durchsuche

Why Doesn't `auto` Deduce a Lambda Expression's Type as a Function Pointer in C  11?

Entmystifizierung der Lambda-Typ-Ableitung mit „auto“ in C 11

Im Bereich von C 11 hat die Einführung von Lambda-Ausdrücken Fragen aufgeworfen hinsichtlich ihres zugrunde liegenden Typs, wenn sie mit dem Schlüsselwort „auto“ abgeleitet werden. Die Annahme, dass der Typ eines Lambda ein Funktionszeiger ist, erweist sich als unzutreffend, wie im folgenden Codeausschnitt gezeigt wird:

#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 zeigt die Diskrepanz bei der Typableitung zwischen einem Funktionszeiger und dem Lambda-Ausdruck mithilfe des „auto " Stichwort. Interessanterweise scheitert die Behauptung und zeigt, dass der Typ des Lambda kein Funktionszeiger ist.

Enthüllung der wahren Natur von Lambda-Typen

Um dieses scheinbare Paradoxon zu verstehen, Es ist wichtig zu erkennen, dass der Typ eines Lambda-Ausdrucks in C 11 nicht spezifiziert bleibt. Sie dienen als syntaktische Konstrukte, die sich nahtlos in übersetzen lassen Funktoren. Bei dieser Konvertierung werden eingeschlossene Elemente in eckigen Klammern („[]“) zu Konstruktorparametern und Klassenmitgliedern, während Elemente in Klammern zu Parametern für den Operator() des Funktors werden.

Bemerkenswert ist, dass ein Lambda ohne Variablenerfassung ( leere eckige Klammern) verfügt über die Fähigkeit, in einen Funktionszeiger umgewandelt zu werden, eine Fähigkeit, die von MSVC2010 nicht unterstützt wird. Es bleibt jedoch wichtig zu betonen, dass eine solche Konvertierung zwar möglich ist, der inhärente Typ des Lambda jedoch ein eindeutiger, nicht spezifizierter Funktortyp ist.

Schlussfolgerung

Das „auto Das Schlüsselwort „bietet eine praktische Typableitung, es ist jedoch wichtig, die zugrunde liegenden Typen verschiedener Sprachentitäten zu erkennen. Im Fall von Lambda-Ausdrücken unterstreichen ihre nicht spezifizierte Natur und die Möglichkeit der Konvertierung in Funktionszeiger (sofern zutreffend) die Flexibilität, die C 11 bietet, und unterstreichen gleichzeitig, wie wichtig es ist, die komplizierten Nuancen der Sprache zu verstehen.

Das obige ist der detaillierte Inhalt vonWarum leitet „auto' den Typ eines Lambda-Ausdrucks nicht als Funktionszeiger in C 11 ab?. 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