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

В C++11 это позволяет создать 0 длина массива C и std:array такой:

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

1 ответов


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

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

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

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

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

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

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