2012-05-16 14 views
8

codice come questo può funzionare bene:qual è il tipo di elenco di inizializzazione nell'array C++?

char str[] = {'a', 'b', '\0'}; 

La sinistra è una variabile automatica (array).

codice come questo può NON lavoro:

char *str = {'a', 'b', '\0'}; 

Il lato sinistro è un puntatore. Il puntatore punta a uno spazio sconosciuto, quindi questo fallirà.

La mia domanda è, qual è il tipo di lato destro?

In C++ 11, un elenco di inizializzazione diventa std::initializer_list. Ma per quanto riguarda il vecchio C++ 03?

+1

Il RHS non è sempre un 'std :: initializer_list' in C++ 11. – juanchopanza

+0

@juanchopanza C'è qualche breve documento su questo? – liuyanghejerry

+1

Forse [qui] (http://en.wikipedia.org/wiki/C%2B%2B11#Initializer_lists) e [qui] (http://www2.research.att.com/~bs/C++0xFAQ .html # init-list) anche se non è chiaro al 100%. Ho dovuto attraversare dolorosamente lo standard. – juanchopanza

risposta

8

In C++ 03 un inizializzatore racchiuso tra parentesi è solo un dispositivo sintattico che può essere utilizzato per inizializzare gli aggregati (come matrici o determinati tipi di classi o strutture). Non ha un 'tipo' e può essere usato solo per quei tipi specifici di inizializzatori.

8.5.1/2 "aggregati":

Quando un aggregato viene inizializzato l'inizializzatore può contenere un inizializzatore clausola costituito da un brace- chiusa, separati da virgole elenco di inizializzazione-clausole per i membri dell'aggregato, scritto in ordine crescente di pedici o membri.

0

Dal progetto di C++ 11:

8.5 Initializers

16 la semantica di inizializzatori sono i seguenti. Il tipo di destinazione è il tipo di oggetto o riferimento inizializzato e il tipo di origine è il tipo di espressione di inizializzazione. Il tipo di origine non è definito quando l'inizializzatore è un elenco di parentesi rinforzato o quando è un elenco di espressioni parentesi con .

+0

Grazie, ma questo non è quello che sto veramente chiedendo. Te lo chiedo in C++ 03. – liuyanghejerry

4

In C++ 03 il lato destro è un inizializzatore-elenco. Non ha alcun tipo, serve solo allo scopo di fornire un mezzo per inizializzare i valori per gli identificatori.

questo è definito in:

C++ 03 8.5.1 Inizializzatori [dcl.init]

Un dichiaratore può specificare un valore iniziale per l'identificatore di essere dichiarato. L'identificatore indica un oggetto o riferimento inizializzato. Il processo di inizializzazione descritto nella parte restante di 8.5 si applica anche alle inizializzazioni specificate da altri contesti sintattici, come l'inizializzazione di parametri di funzione con espressioni di argomento (5.2.2) o l'inizializzazione di valori di ritorno (6.6.3).

initializer: 
     = initializer-clause 
     (expression-list) 
initializer-clause: 
     assignment-expression 
     { initializer-list ,opt } 
     { } 
initializer-list: 
     initializer-clause 
     initializer-list , initializer-clause 
0
int num [3] = {1,2,3} ; 

int num [0]= 1 ; 
num [1]= 2 ; 
num [2] = 3 ; 
Problemi correlati