2015-03-08 4 views
6

Что значит иметь std::array<int,0>, массив нулевого размера?std :: массив нулевого размера

Вопросы, связанные с простым типом массива и языком C, я рассмотрел аналогичные вопросы в SO, и все эти вопросы касаются простого типа массива, а большинство из них говорит, что это незаконно. Но в C++ допускается array<int,0>.

В соответствии с cppreference.com

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

Почему это не так незаконно?

+7

Потому что шаблонный код может воспользоваться чем-то вроде этого. – sbabbi

+2

Почему это должно быть незаконным? Мне было бы очень неприятно, если бы мне пришлось добавлять специальные коды к моему коду, чтобы избежать массива нулевого размера, вместо того, чтобы позволить 'array' обрабатывать этот случай очевидным образом. –

+0

@MikeSeymour 'int x [0];' * is * незаконно. Я думаю, вопрос в том, почему разница. – Angew

ответ

9

Что значит иметь std :: array, array of zero?

То же, что, например, пустой std::vector или пустой std::set.

Почему это не так незаконно?

Это желательно, чтобы сделать его законным, поскольку это означает, что обобщенное программирование не должен обрабатывать особый случай, когда размер std::array «s является результатом вычисления времени компиляции.

Возможно, чтобы определить его как легальное благодаря шаблону специализации. Например, реализация, которая поставляется с Visual C++ специализируется std::array способом, аналогичным следующему:

template<class T> 
class array<T, 0> // specialisation 
{ 
    // ... 

    size_type size() const 
    { 
     return 0; 
    } 

    T elements[1]; // the raw array cannot have a size of 0 
}; 

Я полагаю, каждый компилятор реализует std::array подобное.

+0

шаблон специализация подобный? Какое ненужное дублирование мы имеем для этого условный оператор. – Deduplicator

+2

Это довольно удивительная реализация. По умолчанию построение 'T', когда я запрашиваю массив с нулем' T', является ... нечетным. –

+0

@ T.C: Ну, это взято прямо из реального файла заголовка VC ... –

2

std :: array рассматривается как другие стандартные контейнеры, которые могут быть пустыми. Таким образом, специализация std::array с N равным нулю определяет пустой контейнер.

+0

В стороне, это * никогда * пустой тип, хотя ... – Deduplicator

Смежные вопросы