Heim >Backend-Entwicklung >C++ >Wie funktioniert der Operator „' mit einem nicht erfassenden Lambda in C?
Im Bereich der C-Codierung wird das Verhalten des Operators ' ' auf ein Lambda angewendet (' []{}') hat Neugier geweckt. Obwohl der Code unkonventionell erscheint, lässt er sich überraschenderweise erfolgreich mit großen Compilern kompilieren. Aber wie funktioniert diese Ausnahme von der Norm?
Der Schlüssel zum Verständnis dieses Verhaltens liegt in den Überladungen des Operators „ “. Bei Anwendung auf das Lambda löst „ „ eine Konvertierung in einen einfachen alten Funktionszeiger aus. Dies ist möglich, weil das betreffende Lambda nicht erfassend ist, was bedeutet, dass es keine externen Variablen referenziert.
Gemäß dem C-Standard (Abschnitt 5.1.2) hat ein nicht erfassendes Lambda-Abschlussobjekt eine öffentliche, nicht virtuelle Konvertierungsfunktion, die einen Funktionszeiger zurückgibt. Dieser Zeiger zeigt auf eine Funktion, die das gleiche Verhalten wie das Lambda aufweist.
Der Operator „ ' verfügt über eine integrierte Überladung, die jeden Typ in einen Zeiger umwandelt . Im Fall des Lambda wird die zuvor erwähnte Konvertierungsfunktion als Kandidatenüberladung ausgewählt. Das Ergebnis ist ein Funktionszeiger mit denselben Parameter- und Rückgabetypen wie der Funktionsaufrufoperator des Lambda.
Wenn also „ “ auf das erste Lambda angewendet wird, wird das Lambda-Abschlussobjekt in einen Funktionszeiger umgewandelt. Dadurch ist es möglich, das zweite Lambda-Abschlussobjekt demselben Funktionszeiger zuzuweisen, da beide Lambdas kompatible Typen haben.
Ja, der Code, der „[]{}“ verwendet, ist normkonform. Der C-Standard ermöglicht die Konvertierung von nicht erfassenden Lambda-Abschlussobjekten in Funktionszeiger. Dieses Verhalten ermöglicht einige überraschende, aber gültige Codierungstricks.
Das obige ist der detaillierte Inhalt vonWie funktioniert der Operator „' mit einem nicht erfassenden Lambda in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!