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

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

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

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

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

Сейчас:

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

Так не должно ли C++11 иметь VLA?

4 ответа

Решение

Эта легкая формулировка не означает, что все в C99 есть в C++11. То, что вы цитировали, это просто вводный текст.

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

[C++11: 8.3.4/1]: В декларации T D где D имеет форму

D1 [ постоянное выражениеopt ] атрибут-спецификатор-seqopt

[..]

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

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

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

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

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

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

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

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

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