Это массивы переменной длины или VLA, которые представляют собой < em>C99, но gcc и clang поддерживает его как расширение в C++, а Visual Studio нет. Таким образом, Visual Studio
в данном случае придерживается стандарта и является технически правильным. Нельзя сказать, что расширения плохие, ядро Linux зависит от многих расширений gcc, поэтому они могут быть полезны в определенных контекстах.
Если вы добавите флаг -pedantic
, оба gcc
и clang
будут предупреждать вас об этом, например, gcc
говорит (посмотреть вживую):
warning: ISO C++ forbids variable length array 'arr' [-Wvla]
int arr[size];
^
Использование флага -pedantic-errors
сделает это ошибкой. Вы можете прочитать больше о расширениях в этих документах Языковые стандарты, поддерживаемые GCC и раздел языковой совместимости clangs.
Обновить
проект стандарта C++ охватывает то, что представляет собой интегральное постоянное выражение в разделе 5.19
Постоянные выражения параграф 3 и говорит:
Интегральное константное выражение — это выражение интегрального типа или типа перечисления с незаданной областью, неявно преобразованное в prvalue, где преобразованное выражение является основным константным выражением. [...]
После прочтения этого интуитивно не очевидно, что все возможности, но Boost's Coding Guidelines for Integral Constant Expressions отлично с этим справляется.
В этом случае, поскольку вы инициализируете size
литералом, используя const, будет достаточно, чтобы сделать его интегральным постоянным выражением (см. [expr.const]p2.9.1), а также вернуть код к стандарту C++:
const int size = 10;
использование constexpr тоже сработает:
constexpr int size = 10;
Вероятно, было бы полезно прочитать Разницу между constexpr
и const
.
Для ссылки на раздел, эквивалентный 8.3.4
параграфу 1 в проект стандарта C99 будет разделом 6.7.5.2
Деклараторы массивов параграфом 4, в котором говорится (выделено мной):
Если размер отсутствует, тип массива является неполным. Если размер равен *, а не является выражением, тип массива является типом массива переменной длины неопределенного размера, который может использоваться только в объявлениях с областью действия прототипа функции;124) такие массивы, тем не менее, являются полными. типы. Если размер представляет собой целочисленное константное выражение, а тип элемента имеет известный постоянный размер, тип массива не является типом массива переменной длины; в противном случае тип массива является типом массива переменной длины.
person
Shafik Yaghmour
schedule
22.01.2014
std::valarray
предлагается в C++1y - person Bryan Chen   schedule 22.01.2014std::dynarray
, но и это, и VLA находятся в TS AFAIK. - person chris   schedule 22.01.2014size
не является постоянным выражением, поскольку, среди прочего, его можно изменить. - person Keith Thompson   schedule 02.04.2014