Matriz de longitud variable (VLA) en compiladores C ++

Como ya sabemosVLA (estandarizado enC99) no son parte del estándar en C ++.

Entonces el siguiente código es"ilegal" enC ++:

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

A pesar de eso, el compilador (g ++ yclang ++) acepta el código como sintaxis válida, produciendo solo unadvertencia en caso-pedantic la bandera está habilitada.

ISO C ++ prohíbe la matriz de longitud variable "vla" [-Wvla]

Mis preguntas son:

¿Por qué el compilador acepta esa declaración?
El compilador no puede simplemente rechazar una matriz en la que la longitud[is-no-know-at-compile-time]?
¿Hay algún tipo de regla de sintaxis de compatibilidad a seguir?

¿De qué dice la norma?
Del código de ensamblaje producido veo que el compilador escribe en la pila en el bucle, como una matriz normal, pero no puedo encontrar nada sobre el comportamiento estándar.

Respuestas a la pregunta(2)

Su respuesta a la pregunta