Ответ 1
Эта формулировка не означает, что все и все на C99 находится в С++ 11. Вы цитируете только вводный текст.
Нет, подождите, несите меня...
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?
Эта формулировка не означает, что все и все на C99 находится в С++ 11. Вы цитируете только вводный текст.
Эта функция C99 эффективно переопределяется собственной семантикой С++, что может быть любой иначе "унаследованной" функцией:
[C++11: 8.3.4/1]
: В объявленииT D
, гдеD
имеет вид
D1
[константное выражение opt] attribute-specifier-seq opt[..]
Это единственный синтаксис объявления массива, который мы даем в С++.
Обратите внимание, что упоминание этой разницы не указано в разделе "совместимость с 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: warning: ISO С++ запрещает массив переменной длины" n [-Wvla] "
int main(int argc, char ** argv) {
int n[argc];
}
Значит, размер n
не может быть известен во время компиляции во время компиляции. Является ли это расширением GNU для С++? Это похоже на расширение GNU, и что VLA не являются официальной частью С++ 11.
(Конечно, я просто играю с компилятором. Так что сделайте это с щепоткой соли.)