Heim > Backend-Entwicklung > C++ > Warum ermöglicht das Hinzufügen eines unären „'-Operators eine Lambda-Neuzuweisung in C?

Warum ermöglicht das Hinzufügen eines unären „'-Operators eine Lambda-Neuzuweisung in C?

DDD
Freigeben: 2024-12-20 06:38:10
Original
198 Leute haben es durchsucht

Why Does Adding a Unary

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 = []{};
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage