Массив переменной длины (VLA) в компиляторах C ++

Как мы уже знаем,VLA (стандартизировано вC99) не являются частью стандарта в C ++.

Так что код ниже«Незаконный» вC ++:

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

Несмотря на это компилятор (г ++ а такжелязг ++) принимает код как действительный синтаксис, производящий толькопредупреждение в случае-pedantic флаг включен.

ISO C ++ запрещает массив переменной длины vla [-Wvla]

Мои вопросы:

Почему компилятор принимает это объявление?
Компилятор не может просто отклонить массив, длина которого[is-no-know-at-compile-time]?
Есть ли какое-то синтаксическое правило совместимости, которому нужно следовать?

О чем говорит стандарт?
Из созданного кода сборки я вижу, что компилятор записывает в стек в цикле, как обычный массив, но я не могу найти ничего о стандартном поведении.

Ответы на вопрос(2)

Ваш ответ на вопрос