Ein positives Lambda: ' []{}' – Eintauchen in das Unerwartete
In einem Versuch, die rätselhafte Natur von Lambda-Ausdrücken zu untersuchen , die Frage „Neudefinition von Lambdas in C 11 nicht erlaubt, warum?“ entstand. Eine eigenartige Entdeckung von Johannes Schaub ergab, dass das Hinzufügen eines unären Operators vor dem anfänglichen Lambda die Kompilierung ermöglicht.
Die Abfrage:
Warum wird der folgende Code fehlerfrei kompiliert? :
int main() { auto test = +[]{}; // Note the unary operator + before the lambda test = []{}; }
Entspricht dieses Verhalten den C-Standards?
Das Enthüllung:
Ja, der Code entspricht den C-Standards. Der Operator löst bemerkenswerterweise eine Umwandlung des Lambda in einen einfachen Funktionszeiger aus.
Die Entfaltung:
Der Compiler interpretiert das anfängliche Lambda ([]{}) und erstellt ein Abschlussobjekt. Da dieses Lambda keine Variablen erfasst, gibt es eine Konvertierungsfunktion, um das Abschlussobjekt in einen Funktionszeiger mit identischen Parametern und Rückgabetyp wie der Funktionsaufrufoperator des Abschlusses umzuwandeln.
Diese Konvertierung entspricht den Anforderungen des Unären Operator. Zu den integrierten Überladungen für gehört eine, die jeden Typ T in einen Zeiger auf T umwandelt. Der Abschlusstyp erfüllt diese Anforderung, indem er eine Konvertierung in einen Funktionszeiger bereitstellt.
Folglich lautet der Ausdruck auto test = []{ }; leitet daraus ab, dass der Testtyp void(*)() ist. Dies ermöglicht die anschließende Zuweisung in der zweiten Zeile, wobei auch das zweite Lambda-/Abschlussobjekt die Konvertierung in einen Funktionszeiger erfährt, was zu einer kompatiblen Zuweisung führt.
Bedeutung:
Dieses ungewöhnliche Verhalten unterstreicht die Vielseitigkeit von Lambda-Ausdrücken und die komplizierten Mechanismen der C-Sprache. Es ermöglicht die Neuzuweisung von Lambda-Ausdrücken durch Konvertierung in Funktionszeiger und bietet so Flexibilität und Möglichkeiten zur Codeoptimierung.
Das obige ist der detaillierte Inhalt vonWarum ermöglicht das Hinzufügen eines unären „'-Operators eine Lambda-Neuzuweisung in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!