In einer früheren Frage zum Stapelüberlauf konnte ein scheinbar einfacher Lambda-Ausdruck nicht kompiliert werden. Durch das Hinzufügen eines „ “-Operators vor dem Lambda erlangte der Code jedoch auf wundersame Weise seine Fähigkeit zum Kompilieren. Diese faszinierende Beobachtung wirft die Frage auf: Warum funktioniert ' []{}'?
Der Schlüssel liegt im überladenen Verhalten des Operators ' '. Wenn es auf ein Abschlussobjekt angewendet wird, das von einem nicht erfassenden Lambda generiert wird, ruft es eine integrierte Konvertierungsfunktion auf, die den Abschluss in einen einfachen Funktionszeiger umwandelt.
Diese Konvertierung ist entscheidend, da der Operator „ “ einen Kandidaten hat Überladung, die jeden Typ in einen Zeiger konvertiert. Daher führt die Anwendung von „ “ auf das Abschlussobjekt zu einem Funktionszeiger auf das Lambda.
Der Typ von „test“ nach der Deklaration des ersten Lambda wird zu void(*)(), einem Funktionszeiger mit ein void-Rückgabetyp und keine Parameter. Dadurch kann das zweite Lambda „test“ zugewiesen werden, obwohl es einen anderen Verschlusstyp hat.
Daher kann die Funktionalität des Codes wie folgt erklärt werden:
Dieses Verhalten entspricht vollständig dem C-Standard und macht „[]{}“ zu einem gültigen und überraschend nützlichen Trick für Lambda-Ausdrücke.
Das obige ist der detaillierte Inhalt vonWarum aktiviert „[]{}' die Kompilierung von Lambda-Ausdrücken in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!