Есть ли в 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;
}
}

5

Решение

Текущий стандарт C ++ не требует, чтобы компиляторы VLA. Однако поставщикам компиляторов разрешено поддерживать VLA как расширение.

Первоначально предполагалось, что VLA появятся в C ++ 14, однако это предложение не удалось. Они могут вернуться на C ++ 17.

4

Другие решения

C99 разрешает VLA, но C ++ никогда не допускает этого, потому что производительность VLA настолько недружелюбна. А в C11 VLA становится дополнительной функцией.

Ранее говорилось, что VLA появится на C ++ 17. Но теперь C ++ 17 опубликован, и VLA тоже нет. (И, похоже, в C ++ 20 не будет VLA. В последних документах об этом вообще не говорится.)

Хотя стандарт не поддерживает его, компилятор GNU поддерживает его как расширение.

0