2014-12-08 7 views
11

Cheers e hth. - Alf ha fatto un commento in questo answer che l'inizializzazione del valore è probabilmente una nuova funzionalità di C++ 03 rispetto a C++ 98. Mi chiedo cosa intendesse.Parte di inizializzazione del valore dello standard C++ 98? In caso negativo, perché è stato aggiunto nello standard C++ 03?

È value initialization parte di C++ 98? È presente nel concetto ma non nel nome? Perché è stato aggiunto allo standard C++ 03?

Ho una copia dello standard '03 ma non dello standard '98. Ecco la definizione di inizializzazione e inizializzazione del valore predefinite.

Per default-inizializzare un oggetto di tipo T significa:

- se T è un non-POD tipo di classe (clausola 9), il costruttore di default per T è chiamato (e l'inizializzazione è malato -formato se T non ha il costruttore predefinito accessibile );

- se T è un tipo di matrice, ciascun elemento viene inizializzato di default;

- in caso contrario, l'oggetto viene inizializzato a zero.

Per valore-inizializzare un oggetto di tipo T significa:

- se T è un tipo di classe (clausola 9) con un costruttore dall'utente dichiarato (12.1), quindi il costruttore di default per T è chiamato (e l'inizializzazione è mal formata se T non ha un costruttore predefinito accessibile);

- se T è un non-unione classe tipo senza un costruttore dall'utente dichiarato, allora ogni componente di dati persona e della classe base non statica di T è il valore-inizializzato;

- se T è un tipo di matrice, quindi ogni elemento viene inizializzato in base al valore;

- in caso contrario, l'oggetto è pari a zero-inizializzato

mia ipotesi è che '98 avevano l'inizializzazione di default, ma non l'inizializzazione valore e che c'è qualche differenza fondamentale tra i due. Ad essere onesti, sto avendo problemi a analizzare lo standard qui e non capisco la differenza tra le definizioni.

risposta

9

Citando the ISO/IEC 14882:1998 standard document (che è stato ritirato da ISO):

Per default-inizializzare un oggetto di tipo T significa:

  • se T è un non-POD tipo di classe (clausola 9), viene chiamato il costruttore predefinito per T (e l'inizializzazione è mal formata se T non ha il costruttore predefinito accessibile );
  • se T è un tipo di matrice, ogni elemento viene inizializzato di default;
  • in caso contrario, la memorizzazione per l'oggetto è inizializzata a zero.

E al punto 7:

Un oggetto le cui inizializzatore è un insieme vuoto di parentesi, cioè (), sarà default-inizializzata.

Dettagli sulla logica alla base del cambiamento possono essere trovati in the defect report che ha fatto accadere:

Questa definizione è appropriata per le variabili locali, ma non per oggetti che vengono inizializzati a seguito di esecuzione espressioni di il modulo T(), poiché gli oggetti restituiti da tali espressioni saranno immediatamente copiati e dovrebbero pertanto avere valori che sono sicuri di essere copiabili.
A tal fine, propongo aggiungendo il seguente nuovo testo a 8,5, punto 5:

Per valore-inizializzare un oggetto di tipo T significa:

  • se T è un tipo di classe (clausola 9 [class]) con un costruttore dichiarato dall'utente (12.1), quindi il costruttore predefinito per T è chiamato (e l'inizializzazione è mal formata se T non ha un costruttore predefinito accessibile );
  • se T è un tipo di classe senza un costruttore dichiarato dall'utente, quindi ogni membro di dati non statici e componente di classe base di T è valore inizializzato;
  • se T è un tipo di matrice, quindi ogni elemento viene inizializzato in base al valore;
  • in caso contrario, la memorizzazione per l'oggetto è inizializzata a zero.

Inoltre, propongo di cambiare '' default-inizializzazione '' a '' valore di inizializzazione '' in 5.2.3 comma 2.

E, dopo che, una spiegazione storica :

storia antica

C'era una volta, un AT & T sviluppatore compilatore di nome Laura Eaves chiestoMi: ‘‘quello che dovrebbe essere il valore di int()?’’ Il mio primo pensiero è stato che dovrebbe essere lo stesso valore di x ha dopo aver detto

int x; 

ma presto mi sono reso conto che tale definizione non lo farebbe. Il motivo è che x ha un valore indeterminato (supponendo che sia una variabile locale ), ma non importa che x sia indeterminato, perché siamo presumibilmente andando ad assegnare un valore a x prima di usarlo. Al contrario, int() era preferibile non avere un valore indeterminato, perché la copia di tale valore ha un effetto indefinito.Sarebbe sciocco proibire a un compilatore di contrassegnare int() durante la compilazione, solo per consentirgli di contrassegnarlo durante l'esecuzione con lo ! [...]

+0

Hai capito. Propongo di portare alcune delle motivazioni della DR nella tua risposta per renderla autosufficiente. Fammi sapere quando l'hai fatto in modo da poterti invogliare. :) –

+0

La cosa fastidiosa della versione C++ 98 è che se si ha una classe contenente una 'std :: string' e alcune variabili' int', non c'è modo di ottenerla a zero - inizializza gli inte diversi da elencarli esplicitamente tutti nell'elenco di inizializzazione del costruttore. –

+0

@MattMcNabb Non l'ho seguito. Li elenco tutti nella lista di inizializzatori invece di fare cosa? Se non li si elenca nell'elenco di inizializzazione in C++ 03, vengono inizializzati a zero? – Praxeolitic