Поддерживает ли С++ массивы переменной длины?

Нет, подождите, несите меня...

VLA всегда были расширением GCC, но они были приняты C99:

[C99: 6.7.5.2/4]: Если размер отсутствует, тип массива является неполный type. Если размер равен *, а не выражению, Тип массива - тип массива переменной длины неопределенного размера, который может использоваться только в объявлениях с областью прототипа функции; такие массивы, тем не менее, являются полными типами. Если размер является целым числом константное выражение и тип элемента имеет известный постоянный размер,тип массива не является массивом переменной длины; в противном случае Тип массива - тип массива переменной длины.

C99 также известен как ISO/IEC 9899:1999.

Сейчас:

[C++11: 1.1/2]: С++ - это язык программирования общего назначения на языке программирования C, как указано в ISO/IEC 9899: 1999 (далее именуемый стандартом C). В добавок к средства, предоставляемые C, С++, предоставляют дополнительные типы данных, классы, шаблоны, исключения, пространства имен, перегрузка оператора, имя функции перегрузки, ссылок, операторов бесплатного управления магазинами и дополнительные библиотеки.

Значит, у С++ 11 тоже есть VLA?

Ответ 1

Эта формулировка не означает, что все и все на C99 находится в С++ 11. Вы цитируете только вводный текст.

Ответ 2

Эта функция C99 эффективно переопределяется собственной семантикой С++, что может быть любой иначе "унаследованной" функцией:

[C++11: 8.3.4/1]: В объявлении T D, где D имеет вид

D1 [константное выражение opt] attribute-specifier-seq opt

[..]

Это единственный синтаксис объявления массива, который мы даем в С++.

Обратите внимание, что упоминание этой разницы не указано в разделе "совместимость с C" C.1.

Ответ 3

Определение константного выражения для двух языков различно.

const size_t size = 5;
int array[size]; // array in C++, VLA in C

Ответ 4

Это компилируется для меня: (g++ 4.6 с -std=c++0x). Но он не компилируется с помощью -pedantic (спасибо @MarkB). Вместо этого он предупреждает, что "template.cpp: 7: 12: warning: ISO С++ запрещает массив переменной длины" n [-Wvla] "

int main(int argc, char ** argv) {
    int n[argc];
}

Значит, размер n не может быть известен во время компиляции во время компиляции. Является ли это расширением GNU для С++? Это похоже на расширение GNU, и что VLA не являются официальной частью С++ 11.

(Конечно, я просто играю с компилятором. Так что сделайте это с щепоткой соли.)