Как вы сами сказали, std::dynarray
это для динамического массива фиксированного размера . Его размер нельзя изменить. Грубо говоря, это улучшение снова new T[N]
и снова std::unique_ptr<T[]>(new T[N])
.
Отсутствие необходимости изменять размер или управлять емкостью означает, что вы можете реализовать структуру данных с меньшей сложностью и на меньшем пространстве.
Более того, std::dynarray
это странное животное, которое позволяет реализации реализовать его разными, неспецифическими способами, например, можно поместить массив в стек. Вызов функции распределения «необязателен». Вы можете указать распределитель для создания элементов массива, но он не является частью типа.
Вы также можете задаться вопросом, зачем нам std::dynarray
и массивы переменной длины. VLA в C ++ 14 гораздо более строгие; они могут быть только локальными автоматическими переменными и не предлагают возможности указать политику распределения, и, конечно же, у них нет стандартного интерфейса контейнера.
Некоторые примеры из 23.3.4.2 "текущего черновика" (возьмите это, кеш Google):
explicit dynarray(size_type c);
Эффекты: выделяет место для хранения c
элементов. Может или не может вызывать глобальный operator new
.
template <class Alloc>
dynarray(size_type c, const Alloc& alloc);
Эффекты: Эквивалентен предыдущим конструкторам, за исключением того, что каждый элемент создается с помощью конструкции uses-allocator .
Независимо от того или нет , вы можете использовать данный аллокатор для построения элементов массива является глобальной чертой:
шаблон struct uses_allocator, Alloc>: true_type {};
Требуется: Alloc
должен быть Распределителем (17.6.3.5). [ Примечание: специализация этого признака сообщает другим компонентам библиотеки, которые dynarray
могут быть созданы с помощью распределителя, даже если он не имеет вложенного типа allocator_type.]
Изменить: ответ Джонатана Уэйкли должен быть гораздо более авторитетным и проницательным.