Ваш первый пример не является стандартным 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.
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html – itdoesntwork
Нет, C++ не разрешает массивы нулевой длины. Даже если бы это было так, это не было бы указателем. –
@MikeSeymour: над кодом мирно компилируется в 'g ++ version 4.8.3' с' -std = C++ 11' –