Як ви вже сказали самі, 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, Alloc>: true_type {};
Потрібно: Alloc
повинен бути розподілювачем (17.6.3.5). [ Примітка: Спеціалізація цієї ознаки інформує про інші компоненти бібліотеки, які dynarray
можна сконструювати за допомогою розподільника, хоча він і не має вкладеного типу allocator_.]
Редагувати: відповідь Джонатана Уейклі обов’язково буде набагато авторитетнішою та проникливішою.