Каково использование массива 0-length (или std:: array)?

В С++ 11 он позволяет создавать массив 0 длины C и std:array следующим образом:

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

Ответ 1

Ваш первый пример не является стандартным С++, но расширение, которое разрешены как gcc, так и clang, это версия гибкие массивы и этот ответ на вопрос: действительно ли нужны гибкие члены массива? объясняет многие преимущества этой функции, Если вы скомпилировали флажок -pedantic, вы получили следующее предупреждение в gcc:

предупреждение: ISO С++ запрещает массив нулевого размера 'arr1' [-Wpedantic]

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

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

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

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

Он также совместим с другими контейнерами последовательности , которые также могут быть empty.