Я всегда думал, что массивы переменной длины не разрешены в C ++ (см .:Почему массивы переменной длины не являются частью стандарта C ++?). Но почему этот код компилируется и работает?
#include <iostream>
using namespace std;
int main () {
int n;
cin >> n;
int a[n];
for (int i=0; i<n; i++) {
a[i] = i;
}
for (int i=0; i<n; i++) {
cout << a[i] << endl;
}
}
Текущий стандарт C ++ не требует, чтобы компиляторы VLA. Однако поставщикам компиляторов разрешено поддерживать VLA как расширение.
Первоначально предполагалось, что VLA появятся в C ++ 14, однако это предложение не удалось. Они могут вернуться на C ++ 17.
C99 разрешает VLA, но C ++ никогда не допускает этого, потому что производительность VLA настолько недружелюбна. А в C11 VLA становится дополнительной функцией.
Ранее говорилось, что VLA появится на C ++ 17. Но теперь C ++ 17 опубликован, и VLA тоже нет. (И, похоже, в C ++ 20 не будет VLA. В последних документах об этом вообще не говорится.)
Хотя стандарт не поддерживает его, компилятор GNU поддерживает его как расширение.