Talvez eu não seja deste planeta, mas parece-me que o seguinte deve ser um erro de sintaxe:
int a[] = {1,2,}; //extra comma in the end
Mas isso não. Fiquei surpreso quando esse código foi compilado no Visual Studio, mas aprendi a não confiar no compilador MSVC no que diz respeito às regras do C ++, por isso verifiquei o padrão e ele também é permitido pelo padrão. Você pode ver 8.5.1 para as regras gramaticais se não acredita em mim.
Por que isso é permitido? Esta pode ser uma pergunta inútil estúpida, mas quero que você entenda por que estou perguntando. Se fosse um sub-caso de uma regra gramatical geral, eu entenderia - eles decidiram não tornar a gramática geral mais difícil apenas para impedir uma vírgula redundante no final de uma lista de inicializadores. Mas não, a vírgula adicional é explicitamente permitida. Por exemplo, não é permitido ter uma vírgula redundante no final de uma lista de argumentos de chamada de função (quando a função aceitar ...
), o que é normal .
Então, novamente, existe algum motivo específico para que essa vírgula redundante seja explicitamente permitida?
for()
por exemplo), a adição dele lança um aviso do compilador.
if (x = 1)
a gramática não é ambígua, mas é muito ambígua para os seres humanos e, portanto, lança um aviso.
if
exemplo também não é ambíguo. Eu não acho que "ambíguo" significa o que você pensa que significa!
;
quando fica claro o próximo token é na verdade uma próxima declaração.