Forse non vengo da questo pianeta, ma mi sembra che quanto segue dovrebbe essere un errore di sintassi:
int a[] = {1,2,}; //extra comma in the end
Ma non lo è. Sono stato sorpreso quando questo codice è stato compilato su Visual Studio, ma ho imparato a non fidarmi del compilatore MSVC per quanto riguarda le regole C ++, quindi ho controllato lo standard ed è consentito anche dallo standard. Puoi vedere 8.5.1 per le regole grammaticali se non mi credi.
Perché è permesso? Questa potrebbe essere una stupida domanda inutile, ma voglio che tu capisca perché lo sto chiedendo. Se fosse un sotto-caso di una regola grammaticale generale, capirei: hanno deciso di non rendere la grammatica generale più difficile solo per non consentire una virgola ridondante alla fine di un elenco di inizializzatori. Ma no, la virgola aggiuntiva è esplicitamente consentita. Ad esempio, non è consentito avere una virgola ridondante alla fine di un elenco di argomenti di chiamata di funzione (quando la funzione accetta ...
), che è normale .
Quindi, di nuovo, c'è qualche motivo particolare per cui questa virgola ridondante è esplicitamente consentita?
for()
esempio), l'aggiunta di esso genera un avviso del compilatore.
if (x = 1)
non è ambiguo nella grammatica, ma è molto ambiguo per gli umani e quindi genera un avvertimento.
if
esempio è ambiguo. Non credo che "ambiguo" significhi ciò che pensi significhi!
;
quando è chiaro il prossimo token è in realtà un'affermazione successiva.