Perché non è consentito in C++?
Fino a quando non lo si definisce, la variabile non diventa un valore l.
Perché i membri const possono essere inizializzati?
Anche in questo caso, è necessaria una definizione se si desidera prendere l'indirizzo della variabile.
9.4.2 membri dati statici
La dichiarazione di servizi di dati statici membro nella sua definizione classe non è una definizione e può essere di tipo incompleto diverso cv -qualificato qualificata. La definizione per un membro di dati statici deve apparire in un ambito dello spazio dei nomi che racchiude la definizione di classe del membro. Nella definizione a ambito namespace, il nome del membro di dati static deve essere qualificato con il suo nome di classe utilizzando il :: dell'operatore. L'espressione di inizializzazione nella definizione di un dati statici membro è nel campo di applicazione della sua classe
Inoltre, si tratta principalmente di un artefatto utilizzo in modo che si può scrivere:
class S {
static const int size = 42;
float array[ size ];
};
fa questo significa che le variabili statiche in C++ non sono inizializzate con 0 come in C?
No essi sono:
3.6.2 Inizializzazione delle variabili non locali
variabili con durata statica stoccaggio (3.7.1) o durata di conservazione filo (3.7. 2) deve essere zeroinitialized (8.5) prima di qualsiasi altra inizializzazione prende il numero .
Anche se le cose si fanno un po 'più complicato in C++ 0x. Tutti i tipi letterali possono ora essere inizializzati (al contrario dei soli tipi interi nello standard corrente), il che significherebbe che tutti i tipi scalari (float inclusi) e alcuni tipi di classi possono ora essere inizializzati usando un inizializzatore nella dichiarazione.
Grazie per l'ottima risposta, mi hai impedito di strapparmi l'udito dalla testa! Ho una domanda però, esiste un modo possibile per fornire un puntatore nullo mentre si definiscono i membri di riferimento? –
@TimVisee Non sono sicuro che sia possibile, almeno in un modo non portatile, senza UB, ma si otterrebbe un riferimento non valido. Se vuoi la semantica NULL basta usare un puntatore o forse usare qualcosa come Boost Optional. –