Heim >Backend-Entwicklung >C++ >Warum aktiviert „[]{}' die Kompilierung von Lambda-Ausdrücken in C?

Warum aktiviert „[]{}' die Kompilierung von Lambda-Ausdrücken in C?

Barbara Streisand
Barbara StreisandOriginal
2024-12-24 18:21:18642Durchsuche

Why Does

Das Geheimnis von „ “ mit Lambda-Ausdrücken lüften: „[]{}“

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:

  1. Das erste Lambda ist mit dem Operator „ “ in einen Funktionszeiger umgewandelt.
  2. Der Typ „test“ wird zu einem Funktionszeiger void(*)().
  3. Das zweite Lambda wird ebenfalls in einen Funktionszeiger umgewandelt, um die Kompatibilität mit „test“ sicherzustellen.
  4. Die Zuweisung an „test“ gelingt, da beide Funktionszeiger kompatibel sind .

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!

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