> As for it being a template constraint, it's the whole point of having a template constraint. In fact, it gives more meaningful feedback than "too complex" which doesn't carry actionable information.

It gives feedback in the sense that the user knows which traits he is not respecting. It doesn't tell him *why* he needs the trait in the first place. If I were to hit that constraint, I'd file it as a "zealous constraint bug".

Having an error message helps the coder understand why what he is trying to do isn't working. I wrote "too complex" for brevity, but the idea was to have an elaborate message.

This is style, arguably, so OK.

> I don't understand the !hasElaborateAssign!T or !hasElaborateCopyConstructor!T restrictions. D does allow objects to be moved, which is what the internals do.

The internals are doing a move when you relocate the buffer, yes. But when you simply insert a new object, you merely do: `buf[j] = c;` This requires assignability. Also, since you aren't initializing your objects prior to said assignment, you'll run into problems for objects with elaborate assigns.

As for the memmove, that's only when relocating your dynamic buffer. When you *first* allocate your first buffer, and *copy* the memory from the static buffer to the new malloc'd buffer. If the object has an elaborate CC, then it requires either calling it, or re-initializing the static array to T.init. Otherwise, you'll have duplicate objects with no posblit called.