Interessant, fanden Sie es nützlich für etwas? Ich denke, es ist ein Trick, stark typisierte (markierte Typen) Einzelinstanzen zu generieren.
alfC
@alfC: Nicht besonders nützlich, nein
Leichtigkeitsrennen im Orbit
Antworten:
262
Zuerst nehmen wir eine Zusammenfassung des Moor-Standard-UDT (User-Defined Type):
struct foo {virtualvoid f()=0;};// normal abstract type
foo obj;// error: cannot declare variable 'obj' to be of abstract type 'foo'
Erinnern wir uns auch daran, dass wir das UDT zur gleichen Zeit instanziieren können, zu der wir es definieren:
struct foo { foo(){ cout <<"!";}};// just a definitionstruct foo { foo(){ cout <<"!";}} instance;// so much more// Output: "!"
Lassen Sie uns die Beispiele kombinieren und daran erinnern, dass wir eine UDT definieren können, die keinen Namen hat :
struct{virtualvoid f()=0;} instance;// unnamed abstract type// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
Wir brauchen den Beweis für das anonyme UDT nicht mehr, damit wir die reine virtuelle Funktion verlieren können. Auch beim Umbenennen instancein foobleiben wir mit:
struct{} foo;
Nah dran.
Was wäre, wenn diese anonyme UDT von einer Basis stammen würde?
struct bar {};// base UDTstruct: bar {} foo;// anonymous derived UDT, and instance thereof
Schließlich führt C ++ 11 erweiterte Initialisierer ein , sodass wir verwirrende Dinge wie diese tun können:
int x{0};
Und das:
int x{};
Und schließlich das:
struct: bar {} foo {};
Dies ist eine unbenannte Struktur, die von bar abgeleitet ist und mit einem leeren Initialisierer als foo instanziiert wird.
Ich weiß, dass negative Kommentare zu einer Programmiersprache vermieden werden sollten, und vielleicht ist es hier ein bisschen unangebracht. Aber ich verstehe nicht, warum C ++ 0x eine noch komplexere Sprache wird als C ++. Wer will das? Was sind die Vorteile einer immer kryptischer werdenden Programmiersprache? Diese Erklärung ist meiner Meinung nach ein weiteres Beispiel dafür. Ich benutze C ++ seit vielen Jahren und habe immer noch Schwierigkeiten, diese Sprache zu beherrschen.
Giorgio
26
@Giorgio: Warum ist das ein Problem? Was genau macht dir Angst? Die beschriebene Konstruktion ist ein Randfall, der von der Sprache zugelassen wird und sich natürlich aus ihren Kernkonzepten ergibt, daran ist nichts auszusetzen. Es ist auch von sehr begrenztem Nutzen. Sie werden es nie benutzen müssen. Es ist jedoch syntaktisch logisch und kollidiert oder kollidiert mit nichts. Warum sollte dies ein Argument gegen eine Sprache sein, insbesondere gegen eine Sprache, die außergewöhnlich gut gestaltet ist?
Kerrek SB
13
@Giorgio - das Wunderbare ist, dass die Situation genau umgekehrt ist; c ++ 0x fügt viele so viel erwartete leistungsstarke Funktionen hinzu, ohne kryptisch oder zu hässlich zu sein. du willst kryptisch? - Schauen Sie sich Perl an. Dieses Beispiel nähert sich hier nirgends dem Titel kryptisch.
Gene Bushuyev
18
@ Kerrek SB Ich denke, C ++ (und jetzt C ++ 0x) hat einfach zu viele verschiedene Konzepte und das Erlernen der Syntax und Semantik ist schwierig. Jeder Programmierer (ich bin einer von ihnen) verwendet am Ende eine Teilmenge der Sprache, weil es zu viele verschiedene Möglichkeiten gibt, dasselbe zu tun. Ich denke nicht, dass C ++ gut gestaltet ist. Es gibt viele Ad-hoc-Funktionen und bestimmte grundlegende Dinge wie ein robuster Modulmechanismus (Import / Export) fehlen (wobei immer noch das alte #include aus C verwendet wird). Ich denke, die C ++ 0x-Bemühungen sollten darauf abzielen, C ++ kleiner und benutzerfreundlicher zu machen, nicht größer.
Giorgio
31
@Giorgio: Um ehrlich zu sein, müsste jede solche Anstrengung daran arbeiten, C ++ von Grund auf neu zu erstellen , dh eine neue Sprache zu erstellen . Und das wurde schon oft gemacht.
Leichtigkeitsrennen im Orbit
106
Dies definiert:
eine anonyme Struktur,
welches öffentlich abgeleitet wird von bar
which ( anonymously) definiert nichts anderes als das, woraus es abgeleitet wurdebar
und schließlich wird eine Instanz namens "foo" erstellt,
Antworten:
Zuerst nehmen wir eine Zusammenfassung des Moor-Standard-UDT (User-Defined Type):
Erinnern wir uns auch daran, dass wir das UDT zur gleichen Zeit instanziieren können, zu der wir es definieren:
Lassen Sie uns die Beispiele kombinieren und daran erinnern, dass wir eine UDT definieren können, die keinen Namen hat :
Wir brauchen den Beweis für das anonyme UDT nicht mehr, damit wir die reine virtuelle Funktion verlieren können. Auch beim Umbenennen
instance
infoo
bleiben wir mit:Nah dran.
Was wäre, wenn diese anonyme UDT von einer Basis stammen würde?
Schließlich führt C ++ 11 erweiterte Initialisierer ein , sodass wir verwirrende Dinge wie diese tun können:
Und das:
Und schließlich das:
Dies ist eine unbenannte Struktur, die von bar abgeleitet ist und mit einem leeren Initialisierer als foo instanziiert wird.
quelle
Dies definiert:
bar
anonymously
) definiert nichts anderes als das, woraus es abgeleitet wurdebar
quelle