Есть ли в C++ массивы переменной длины?
Я всегда думал, что массивы переменной длины недопустимы в 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;
}
}
2 ответа
Текущий стандарт C++ не требует, чтобы компиляторы VLA. Однако поставщикам компиляторов разрешено поддерживать VLA как расширение.
Первоначально предполагалось, что VLA появятся в C++14, однако это предложение не удалось. Они могут вернуться на C++17.
C99 разрешает VLA, но C++ никогда не допускает этого, потому что производительность VLA настолько недружелюбна. А в C11 VLA становится дополнительной функцией.
Ранее говорилось, что VLA появится на C++17. Но теперь C++ 17 опубликован, и VLA тоже нет. (И, похоже, в C++20 не будет VLA. В последних документах об этом вообще не говорится.)
Хотя стандарт не поддерживает его, компилятор GNU поддерживает его как расширение.