Che cos'è questa pazza sintassi C ++ 11 ==> struct: bar {} foo {} ;?


Risposte:


262

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 instancein 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.


11
So che i commenti negativi su un linguaggio di programmazione dovrebbero essere evitati, e forse è un po 'fuori tema qui. Ma non capisco perché C ++ 0x stia diventando un linguaggio ancora più complesso di C ++. Chi lo vuole? Quali sono i vantaggi di un linguaggio di programmazione che sta diventando sempre più criptico? Questa dichiarazione è IMHO ancora un altro esempio di questo. Uso C ++ da molti anni e ho ancora difficoltà a padroneggiare questo linguaggio.
Giorgio,

26
@Giorgio: perché è un problema? Cosa ti spaventa esattamente? La costruzione descritta è un caso marginale che è consentito dal linguaggio e segue naturalmente dai suoi concetti fondamentali, non c'è nulla di sbagliato in esso. È anche di utilità molto limitata. Non dovrai mai usarlo. Tuttavia, è sintatticamente logico e non si scontra né entra in conflitto con nulla. Quindi, perché questo dovrebbe essere un argomento contro un linguaggio, specialmente uno che è eccezionalmente ben progettato?
Kerrek SB,

13
@Giorgio - la parte meravigliosa è che la situazione è esattamente l'opposto; c ++ 0x sta aggiungendo molte strutture tanto attese senza essere criptiche o troppo brutte; vuoi criptico? - controlla Perl. Questo esempio qui da nessuna parte si avvicina quasi al titolo di criptico.
Gene Bushuyev,

18
@Kerrek SB Penso che C ++ (e ora C ++ 0x) abbia semplicemente troppi concetti diversi e imparare la sintassi e la semantica è difficile. Ogni programmatore (io sono uno di loro) finisce per usare un sottoinsieme della lingua perché ci sono troppi modi diversi di fare la stessa cosa. Non credo che C ++ sia ben progettato. Ci sono molte funzionalità ad-hoc e mancano alcune cose fondamentali come un robusto meccanismo (import / export) (che usa ancora il vecchio #include da C). Penso che lo sforzo del C ++ 0x dovrebbe mirare a rendere il C ++ più piccolo e più facile da usare, non più grande.
Giorgio,

31
@Giorgio: A dire il vero, ogni sforzo del genere dovrebbe lavorare sulla ricostruzione del C ++ da zero, ovvero sulla creazione di un nuovo linguaggio . E questo è stato fatto ... molte volte.
Corse di leggerezza in orbita,

106

Questo definisce:

  • una struttura anonima,
  • da cui è derivato pubblicamente bar
  • che ( anonymously) non definisce nient'altro che ciò da cui derivabar
  • e infine, viene creata un'istanza chiamata "pippo",
  • con un elenco di inizializzatori vuoto

struct : bar {} foo {};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.