Cosa potrebbe significare questo in C ++ 11?
struct : bar {} foo {};
Cosa potrebbe significare questo in C ++ 11?
struct : bar {} foo {};
Risposte:
Innanzitutto, prenderemo un UDT astratto di tipo palude (tipo definito dall'utente):
struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'
Ricordiamo anche che possiamo istanziare l'UDT nello stesso momento in cui lo definiamo:
struct foo { foo() { cout << "!"; } }; // just a definition
struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"
Uniamo gli esempi e ricordiamo che possiamo definire un UDT che non ha nome :
struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
Non abbiamo più bisogno della prova dell'UDT anonimo, quindi possiamo perdere la pura funzione virtuale. Anche rinominando instance
in foo
, restiamo con:
struct {} foo;
Avvicinarsi.
Ora, e se questo UDT anonimo dovesse derivare da qualche base?
struct bar {}; // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof
Infine, C ++ 11 introduce inizializzatori estesi , in modo che possiamo fare cose confuse come questa:
int x{0};
E questo:
int x{};
E, infine, questo:
struct : bar {} foo {};
Questa è una struttura senza nome derivante dalla barra, istanziata come foo con un inizializzatore vuoto.