Como você mesmo disse, std::dynarray
é para um array dinâmico de tamanho fixo . Não é redimensionável. É grosso modo uma melhoria ao longo new T[N]
e mais std::unique_ptr<T[]>(new T[N])
.
Não precisar redimensionar ou gerenciar a capacidade significa que você pode implementar a estrutura de dados com menos complexidade e em menos espaço.
Além disso, std::dynarray
é um animal estranho que permite a implementação para implementá-lo de maneiras diferentes e não específicas, por exemplo, é possível colocar o array na pilha. Chamar uma função de alocação é "opcional". Você pode especificar um alocador para construir os elementos da matriz, mas isso não faz parte do tipo.
Você também pode perguntar por que precisamos std::dynarray
e matrizes de comprimento variável. Os VLAs em C ++ 14 são muito mais restritivos; elas podem ser apenas variáveis locais automáticas e não oferecem nenhuma maneira de especificar uma política de alocação e, claro, não têm uma interface de contêiner padrão.
Alguns exemplos de 23.3.4.2 de um "rascunho atual" (veja isso, cache do Google):
explicit dynarray(size_type c);
Efeitos: aloca armazenamento para c
elementos.Pode ou não invocar o global operator new
.
template <class Alloc>
dynarray(size_type c, const Alloc& alloc);
Efeitos: Equivalente aos construtores anteriores, exceto que cada elemento é construído com a construção de alocador de usos .
Se você ou não pode usar um determinado alocador para construir os elementos da matriz, é uma característica global:
template struct usa_allocator, Alloc>: true_type {};
Requer: Alloc
deve ser um Alocador (17.6.3.5). [ Nota: A especialização desta característica informa outros componentes da biblioteca quedynarray
podem ser construídos com um alocador, mesmo que não tenha um alocador_type aninhado.]
Edit: A resposta de Jonathan Wakely tende a ser muito mais confiável e perspicaz.