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?
Direi che la nota 97 dice che questo è identico a 'int a = 1; int b = a ++; '. –
@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. –
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