Reading the current C ++ 1y draft standard .
From table 99:
T is EmplaceConstructible in X from arg, for zero or more arguments arg, means that the following expression is well-formed: allocator_traits :: construct (m, p, args)
Table 100:
X(il); | Equivalent to | X(il.begin(), il.end()); --------------------+---------------------+-------------------------------- X(i, j); | | Requires: X a(i, j); | | T shall be EmplaceConstructible | into X from *i.
So std::vector<double[3]> v{ {1,2,3}, {4,5,6} }; valid if if double[3] is an EmplaceConstructible of {1,2,3} as an element of the initializer list passed to std::vector<double[3]> .
There is also a proposal for forward iterators, but that is not a problem (since std::initialzier_list iterators are forward iterators).
std::vector<T> takes the std::initializer_list<T> parameter.
So, std::initializer_list<double[3]> is a list of candidates.
Firstly, std::initializer_list<double[3]> x = {{1.0, 2.0, 3.0}}; not compiled in gcc. But suppose this is a bug in gcc.
Secondly, ::new (nullptr) double[3](std::initializer_list<double>{1.0, 2.0, 3.0}); the new placement, which EmplaceConstructable boils down to lacking a suitable construct override, will not compile.
So, double[3] not EmplaceConstruble from std::initalizer_list<double> or from double[3] and nothing else (since the error occurs because I used a bracket, and not because it was in brackets , in the placement new), if the dispenser does not do magic, I do not know to avoid placing a new one.
Thus, your code violates the current draft standard and, possibly, C ++ 11 and, of course, C ++ 03 (which presented more stringent requirements for containers).