Come hai detto tu stesso, std::dynarray
è per un array dinamico di dimensioni fisse . Non è ridimensionabile. Più o meno parlando, è un miglioramento ancora new T[N]
e ancora std::unique_ptr<T[]>(new T[N])
.
Non aver bisogno di ridimensionare o gestire la capacità significa che puoi implementare la struttura dei dati con meno complessità e in meno spazio.
Inoltre, std::dynarray
è un animale strano che consente all'implementazione di implementarlo in modi diversi e non specifici, ad esempio è possibile mettere l'array in pila. La chiamata a una funzione di allocazione è "opzionale". È possibile specificare un allocatore per costruire gli elementi dell'array, ma questo non fa parte del tipo.
Si potrebbe anche chiedere perché abbiamo bisogno std::dynarray
e gli array di lunghezza variabile. I VLA in C ++ 14 sono molto più restrittivi; possono essere solo variabili locali e automatiche e non offrono alcun modo per specificare una politica di allocazione e, naturalmente, non hanno un'interfaccia contenitore standard.
Alcuni esempi dal 23.3.4.2 di una "bozza corrente" (prendilo, cache di Google):
explicit dynarray(size_type c);
Effetti: alloca lo spazio di archiviazione per gli c
elementi. Può o non può invocare il globale operator new
.
template <class Alloc>
dynarray(size_type c, const Alloc& alloc);
Effetti: equivalente ai costruttori precedenti tranne per il fatto che ogni elemento è costruito con la costruzione dell'allocatore degli usi .
O se non si può utilizzare un dato allocatore per costruire gli elementi della matrice è un tratto globale:
struttura del modello usa_allocatore, Alloc>: true_type {};
Richiede: Alloc
deve essere un allocatore (17.6.3.5). [ Nota: la specializzazione di questo tratto informa altri componenti della libreria che dynarray
possono essere costruiti con un allocatore, anche se non dispone di un allocator_type nidificato.]
Modifica: la risposta di Jonathan Wakely è destinata ad essere molto più autorevole e perspicace.