Matriz de comprimento variável (VLA) em compiladores C ++

Como já sabemos,VLA (padronizado emC99) não fazem parte do padrão em C ++.

Portanto, o código abaixo é"ilegal" noC ++:

void foo(int n) {
  int vla[n];
  for (int i = 0; i < n; ++i) {
    vla[i] = i;
  }
}

Apesar disso, o compilador (g ++ eclang ++) aceita o código como sintaxe válida, produzindo apenas umaAviso em caso-pedantic sinalizador está ativado.

O ISO C ++ proíbe a matriz de comprimento variável 'vla' [-Wvla]

Minhas perguntas são:

Por que o compilador aceita essa declaração?
O compilador não pode simplesmente rejeitar uma matriz em que tamanho[is-no-know-at-compile-time]?
Existe algum tipo de regra de sintaxe de compatibilidade a seguir?

Sobre o que o padrão diz?
Pelo código de montagem produzido, vejo o compilador gravando na pilha do loop, como uma matriz normal, mas não consigo encontrar nada sobre o comportamento padrão.

questionAnswers(2)

yourAnswerToTheQuestion