Comme vous l'avez dit vous-même, std::dynarray
est pour un taille fixe réseau dynamique. Il n'est pas redimensionnable. Il s'agit en gros d'une amélioration par rapport à new T[N]
et plus std::unique_ptr<T[]>(new T[N])
.
Le fait de ne pas avoir à redimensionner ou à gérer la capacité signifie que vous pouvez mettre en œuvre la structure de données avec moins de complexité et dans moins d'espace.
De plus, std::dynarray
est un animal bizarre qui permet à l'implémentation de l'implémenter de différentes manières non spécifiques, par exemple, il est possible de mettre le tableau sur la pile. L'appel à une fonction d'allocation est "facultatif". Vous pouvez spécifier un allocateur pour construire les éléments du tableau, mais cela ne fait pas partie du type.
Vous pouvez aussi vous demander pourquoi nous avons besoin std::dynarray
et les tableaux à longueur variable. Les VLA en C++14 sont beaucoup plus restrictifs ; ils ne peuvent être que des variables locales et automatiques et n'offrent aucun moyen de spécifier une politique d'allocation, et bien sûr ils n'ont pas d'interface de conteneur standard.
Quelques exemples tirés de 23.3.4.2 d'un "projet actuel" (prenez ça, Google cache) :
explicit dynarray(size_type c);
Effets : Attribue un espace de stockage pour c
éléments. Peut ou non invoquer l'option globale operator new
.
template <class Alloc>
dynarray(size_type c, const Alloc& alloc);
Effets : Equivalent aux constructeurs précédents sauf que chaque élément est construit avec la construction uses-allocator .
Que vous soyez ou non peut utiliser un allocateur donné pour construire les éléments du tableau est un trait global :
modèle struct uses_allocator, Alloc> : true_type { } ;
Exige : Alloc
doit être un allocateur (17.6.3.5). [ Note : La spécialisation de ce trait informe les autres composants de la bibliothèque que dynarray
peut être construit avec un allocateur, même s'il n'a pas de type allocateur imbriqué].
Edit : La réponse de Jonathan Wakely fera certainement autorité et sera plus perspicace.