Was ist diese verrückte C ++ 11-Syntax ==> struct: bar {} foo {};?

168

Was könnte dies möglicherweise in C ++ 11 bedeuten?

struct : bar {} foo {};
Leichtigkeitsrennen im Orbit
quelle
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 { virtual void 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 definition

struct 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 { virtual void 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 UDT
struct : 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.

Leichtigkeitsrennen im Orbit
quelle
11
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,
  • mit einer leeren Initialisierungsliste

struct : bar {} foo {};
Frunsi
quelle