Поддерживает ли C ++ массивы переменной длины? - PullRequest
31 голосов
/ 21 декабря 2011

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

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 ++ 11 не должно быть VLA?

Ответы [ 4 ]

15 голосов
/ 21 декабря 2011

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

13 голосов
/ 21 декабря 2011

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

[C++11: 8.3.4/1]: в декларации T D, где D имеет вид

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

[..]

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

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

8 голосов
/ 21 декабря 2011

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

const size_t size = 5;
int array[size]; // array in C++, VLA in C
2 голосов
/ 21 декабря 2011

Это компилируется для меня: (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.

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

...