Есть ли в 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 поддерживает его как расширение.

Другие вопросы по тегам