2014-10-06 2 views
10

В C++ 11 позволяет создавать массив 0 длины C и std:array вроде этого:Каково использование массива 0-length (или std :: array)?

int arr1[0]; 
std::array arr2<int,0>; 
  1. Так что я имею в виду, что использование массива, который не имеет места хранить?
  2. Во-вторых, что такое массив нулевой длины? Если это указатель, на что он указывает?
+3

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html – itdoesntwork

+9

Нет, C++ не разрешает массивы нулевой длины. Даже если бы это было так, это не было бы указателем. –

+1

@MikeSeymour: над кодом мирно компилируется в 'g ++ version 4.8.3' с' -std = C++ 11' –

ответ

16

Ваш первый пример не является стандартным C++, но an extension, что оба gcc и clang позволяют, это версия flexible arrays и это answer to the question: Are flexible array members really necessary? объясняет многие преимущества этой функции. Если вы собрали с помощью -pedantic флаг вы получили следующее предупреждение в gcc:

предупреждение: ISO C++ запрещает нулевой размер массива «arr1» [-Wpedantic]

и следующее предупреждение в clang:

предупреждение: нулевые массивы размера являются продолжением [-Wzero-длина массива]

Что касается вашего второго случая нулевой длины std::array, то для более простых общих алгоритмов без специального случая для нулевой длины, например шаблонного непигового параметра типа size_t. Как отмечает cppreference section for std::array, это особый случай:

Существует специальный случай для массива нулевой длины (N == 0). В этом случае array.begin() == array.end(), что является некоторым уникальным значением. Эффект вызова front() или back() в массиве нулевого размера не определен.

Было бы также привести его в соответствие с другими sequence containers, которые также могут быть empty.