You can't do std::vector<int[3]>.
std::vector<T> requires T to be Erasable, which means that the expression
allocator_traits<A>::destroy(m, p)
is well formed. When A = std::allocator<int[3]>, this tries to do
p->~T()
which is equivalent to
(*p).~T()
where p is of type int(*)[3] and T is int[3]. Arrays are not allowed to appear in a pseudo destructor call: [expr.pseudo]/2
The left-hand side of the dot operator shall be of scalar type. [...]
(Arrays are not scalar types.)
You can use std::array<int, 3> though. It is compared in lexicographical order by default.