2013-04-25 18 views
18

int a=1, b=a++; invoca un comportamento non definito? Non vi è alcun punto di sequenza che intervenga tra l'inizializzazione di a e il suo accesso e modifica nell'inizializzatore per b, ma per quanto posso dire, l'inizializzazione non è "modifica" dell'oggetto; viene specificato un inizializzatore per fornire il "valore iniziale" dell'oggetto. Per 6.7.8 Inizializzazione, paragrafo 8:Int a = 1, b = a ++; invocare un comportamento indefinito?

Un inizializzatore specifica il valore iniziale memorizzato in un oggetto.

e sembra ragionevole prendere "iniziale" come sequenziato prima di qualsiasi accesso all'oggetto. Questo problema è già stato preso in considerazione e c'è un'interpretazione accettata?

+0

Direi che la nota 97 dice che questo è identico a 'int a = 1; int b = a ++; '. –

+0

@KerrekSB: Nota 97 in quale versione (o bozza) dello standard? I numeri delle note a piè pagina sono molto meno stabili dei numeri di sezione. –

+0

IIRC, nelle versioni più recenti dello standard, il concetto di "punti di sequenza" è in fase di obsolescenza. Per quanto riguarda le note a piè di pagina, c'è stata recentemente una discussione su una nota a piè di pagina che ha definito l'ordine di elaborazione del costrutto declare-e-inizializza, e quella nota a piè di pagina sembra effettivamente abbastanza vecchia e stabile :) – quetzalcoatl

risposta

24

Non richiama il comportamento non definito. In 6.7.6 (3), è indicato

Un dichiarante completo è un dichiaratore che non fa parte di un altro dichiaratore. La fine di un dichiarante completo è un punto di sequenza.

che la fine di un dichiaratore completo è un punto di sequenza.

int a = 1, b = a++; 
    //^end of full declarator 
+0

'6.7.6 (3)' <- che cos'è? – Sayakiss

+1

Sezione 6.7.6, paragrafo 3, della norma (beh, la bozza N1570, dal momento che non ho i soldi per comprare uno standard costoso che non _ veramente necessario). Questa sezione riguarda i dichiaratori. –