1 | template <typename=void> struct _ {}; |
2 | |
3 | auto l = [_=_<>{}](){}; |
Kann mir jemand erklaeren was das macht?
|
Forum: PC-Programmierung C++ Token-Suppe: Was macht dieses gebilde?
Kann mir jemand erklaeren was das macht? Eine kleine Herausforderung an den Compiler, die validen C++14 Code darstellt und zu exakt 0 Maschinenbefehlen übersetzt wird. Dr. Sommer schrieb: > Den Leser verwirren. Sonst absolut gar nichts.
Hier wird ein Klassentemplate mit dem Namen "_" definiert.
Hier wird l mit einer anonyme Funktion initialisiert, die durch die lambda-expression auf der rechten Seite des (ersten von links) "=" erzeugt wird. In den [] ist das Capture: dort wird eine Instanz von "_" erzeugt und in das capture "_" kopiert. Die Parameterliste () der lambda-expression und der Körper {} sind leer. :
Bearbeitet durch User
Wilhelm M. schrieb:
So ist es noch "schöner":
Frage: welchen Typ hat l? :
Bearbeitet durch User
Wenn man alles umbenennt, wird es einfacher:
Dass der Name eines Templates ohne die <> noch im Namensraum zur Verfügung steht, war mir bisher nicht klar: vector<int> vector ist anscheinend völlig legal und wahrscheinlich der feuchte Traum der Fans der ungarischen Notation. Wenn man den return type des lambda angibt, kann man noch ein paar verwirrende Zeichen mehr unterbringen:
Tom schrieb: > Wenn man den return type des lambda angibt, kann man noch ein paar > verwirrende Zeichen mehr unterbringen: >
Das werden die freu(n)dlosen dieser Sprache sicher wieder längere Zeit zitieren. :
Bearbeitet durch User
Wenn wir schon bei Codefolter sind:
https://de.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest oder wie Wahnsinnigen von Perl: https://de.wikipedia.org/wiki/Obfuscated_Perl_Contest Passend zum Nachbarthread: Beitrag "Bios PW vergessen!" Hier ein Code-Vorhängeschloss: http://www.ioccc.org/2015/duble/prog.c Torsten R. schrieb: > Wilhelm M. schrieb: >> Frage: welchen Typ hat l? > > _<> (_<void>) Leider kein Hauptgewinn ... Wobei ich mir nicht sicher bin, was Du meinst, denn das, was Du geschrieben hast, ist kein Typ. Oder meintest Du _<> (*)(_<>), das wäre ein Funktionszeiger, mit einem Parameter Typ _<> und Rückgabetyp _<>? Und falls Du den Typ der lambda-expression meinst: den kann man nicht angeben. Ok, der Typ von l ist: _<> Auf der rechten Seite steht eine lambda-expression, die liefert ein Funktionsobjekt, das wird sofort aufgerufen, das liefert ein Objekt des Typs _<> und damit wird l initialisiert und bekommt durch Typinferenz denselben Typ. Wilhelm M. schrieb: > Torsten R. schrieb: >> Wilhelm M. schrieb: >>> Frage: welchen Typ hat l? >> >> _<> (_<void>) > > Leider kein Hauptgewinn ... > > Wobei ich mir nicht sicher bin, was Du meinst Er meinte schon das Richtige. Das Klammerpaar gehört nicht zur Typbezeichnung, sondern ist zu lesen als "oder alternativ". Also _<> oder alternativ _<void> Beides ist richtig. Bei solchen Dingen lobe ich mir aber Haskell, wo man im interaktiven Modus den Typ einer Variable einfach mit :t <Variablenname> anzeigen lassen kann :) Yalu X. schrieb: > Wilhelm M. schrieb: >> Torsten R. schrieb: >>> Wilhelm M. schrieb: >>>> Frage: welchen Typ hat l? >>> >>> _<> (_<void>) >> >> Leider kein Hauptgewinn ... >> >> Wobei ich mir nicht sicher bin, was Du meinst > > Er meinte schon das Richtige. Gut, dass Du weißt, was andere Leute meinen ... Wilhelm M. schrieb: > Gut, dass Du weißt, was andere Leute meinen ... Naja, das war in diesem Fall ja wirklich nicht schwer zu verstehen, vor allem dann, wenn man die beiden Lösungen des Rätsels schon kennt. Man kann sich natürlich auch alle Mühe geben, andere nicht zu verstehen :) Yalu X. schrieb: > Wilhelm M. schrieb: >> Gut, dass Du weißt, was andere Leute meinen ... > > Naja, das war in diesem Fall ja wirklich nicht schwer zu verstehen, vor > allem dann, wenn man die beiden Lösungen des Rätsels schon kennt. Zwei Lösungen für ein Rätsel? > Man > kann sich natürlich auch alle Mühe geben, andere nicht zu verstehen :) Das war nicht meine Intention: aber so wie er das oben geschrieben hat, kann man m.E. nicht erkennen, dass das eine Alternative sein sollte. Vor allem habe ich ja auch geschrieben, wie ich das interpretiert habe ... Johann L. schrieb: > Wilhelm M. schrieb: >
>> >> Frage: welchen Typ hat l? > > auto :-) brumm brumm Wilhelm M. schrieb: > Torsten R. schrieb: >> Wilhelm M. schrieb: >>> Frage: welchen Typ hat l? >> >> _<> (_<void>) > > Leider kein Hauptgewinn ... _<> bzw. _<void> Besser? Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
|
|