Массив переменной длины (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]
?
Есть ли какое-то синтаксическое правило совместимости, которому нужно следовать?
О чем говорит стандарт?
Из созданного кода сборки я вижу, что компилятор записывает в стек в цикле, как обычный массив, но я не могу найти ничего о стандартном поведении.