Como usted mismo dijo, std::dynarray
es para una matriz dinámica de tamaño fijo . No es de tamaño variable. En términos generales, es una mejora una new T[N]
y otra vez std::unique_ptr<T[]>(new T[N])
.
No necesitar cambiar el tamaño o administrar la capacidad significa que puede implementar la estructura de datos con menos complejidad y en menos espacio.
Además, std::dynarray
es un animal extraño que permite que la implementación lo implemente de diferentes formas no específicas, por ejemplo, es posible colocar la matriz en la pila. Llamar a una función de asignación es "opcional". Puede especificar un asignador para construir los elementos de la matriz, pero eso no es parte del tipo.
También puede ser que preguntarse por qué necesitamos std::dynarray
y matrices de longitud variable. Los VLA en C ++ 14 son mucho más restrictivos; solo pueden ser variables locales, automáticas y no ofrecen forma de especificar una política de asignación y, por supuesto, no tienen una interfaz de contenedor estándar.
Algunos ejemplos de 23.3.4.2 de un "borrador actual" (tome eso, caché de Google):
explicit dynarray(size_type c);
Efectos: asigna almacenamiento para c
elementos. Puede o no invocar lo global operator new
.
template <class Alloc>
dynarray(size_type c, const Alloc& alloc);
Efectos: Equivalente a los constructores anteriores excepto que cada elemento se construye con una construcción de asignador de usos .
Aun cuando no se puede utilizar un asignador dada para construir los elementos de la matriz es un rasgo mundial:
template struct uses_allocator, Alloc>: true_type {};
Requiere: Alloc
debe ser un Asignador (17.6.3.5). [ Nota: la especialización de este rasgo informa a otros componentes de la biblioteca que dynarray
se pueden construir con un asignador, aunque no tenga un allocator_type anidado].
Editar: La respuesta de Jonathan Wakely seguramente será mucho más autorizada y perspicaz.