
I know that this subject has been discuss a lot in the past. However a quick search in the mailing list archive did not show any solution like the one I propose. If my post is a duplicate, please forgive :-) The problem is that, like many other, I don't use boost::array because it doesn't have any constructor. First, be aware that I want to start a flame war ;-) I understand well the rationale for the aggregate initialization support. I also understand that we want a lightweight wrapper around C arrays. I agree there is a consensus around this and I don't want to break it. However, I have a simple (I think) solution that should give us the best of both worlds. Basically, the idea is to have a third parameter to the template, it is set to false by default in order to provide the same default behaviour. So we have: template<class T, std::size_t N, bool C = false> class array { /* current implementation */ }; template<class T, std::size_t N> class array<T, N, true> : public array<T,N,false> { /* adds constructors only */ }; array<int, 3> a1 = { 1, 2, 3 }; array<int, 3, false> a2 = { 1, 2, 3 }; array<int, 3, true> a3; array<int, 3, true> a4( 1 ); // assign 1 to all three values array<int, 3, true> a5( 1, 2, 3 ); array<int, 3, true> a6( 1, 2 ); // raises a static assert because we try to put only two values in an array of 3 array<int, 3, true> a7( 1, 2, 3, 4 ); // also raises a static assert because we try to put four values in an array of 3 I only see one main drawback with this technique, we'll have some problems with compilers lacking partial specialization support. So the idea is in your hands. I hope it will have some echoes. I attached the modified array.hpp file. It compiles for me on Visual Studio .Net 2003 and 2005 with boost 1.33.1. However I didn't make full test coverage. Thanks Vincent Bherer-Roy