2015-01-30 4 views
4

В N3337, я читаю §23.3.2.1/3 говорится:Что означает «за исключением того, что построенный по умолчанию массив не пуст» означает?

An array удовлетворяет все требования контейнера и одного обратимой емкости (23.2), за исключением, что по умолчанию построены array Объект не пуст, и этот обмен не имеет постоянной сложности.

В §23.2.1, Таблица 96 Контейнерные Требования, он показывает по умолчанию строится объект в X u; где пост условие u.empty(). Предположительно тогда следующее:

std::array<int, 0> a; 

должно приводить с a.empty() вывода 1, что она делает. Так что же означает «пусто»?

+1

А как насчет 'std :: array a;'? – immibis

+0

'a.empty()' истинно в этом случае, потому что 'N == 0', а не потому, что он был сконструирован по умолчанию. И фраза «за исключением того, что ... не пусто» явно делает исключение из требования, а это означает, что построенный по умолчанию массив не должен быть пустым (поскольку его пустота зависит только от значения его постоянного размера N). Я согласен с тем, что он плохо сформулирован, никто не идеален, и писать стандартное лингво сложно, дать этим парням перерыв и прекратить прокручивать проходы, особенно те, где реальный смысл настолько очевиден. –

ответ

8

Вы смотрите на граничный случай - массив нулевого размера пуст или нет? Игнорируя этот конкретный вопрос, стандартная цитата говорит, что общий std::array<T,N> arr, по умолчанию, не удовлетворяет пост-условию arr.empty(). Фактически, std::array<T, N> является empty() только когда N==0. И это определение является естественным также - std::array<T,N>::size() является constexpr со значением N и empty() должно быть синонимом size() == 0.

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