Was könnte dies möglicherweise in C ++ 11 bedeuten?
struct : bar {} foo {};
Was könnte dies möglicherweise in C ++ 11 bedeuten?
struct : bar {} foo {};
Antworten:
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 instance
in foo
bleiben 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.
Dies definiert:
bar
anonymously
) definiert nichts anderes als das, woraus es abgeleitet wurdebar
struct : bar {} foo {};