Поддерживает ли 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.
(Конечно, я просто играю с компилятором. Так что возьмите это с щепоткой соли.)