Why do doubles need special handling though, even on a 32-bit system? My suggestion is that the Double_tag be changed to Flat_tag, meaning that all non-pointer objects can reside in this tag. The only issue I've found so far is that polymorphic <, <=, > and >= would not work. However, these operators should not be allowed on a vector anyway since there is no natural ordering scheme for vectors. If there are other issues, please let me know.
I agree regarding the expansion of 246 constructors. This must have been kept for compatibility with 32 bit systems. I think what should happen in 32 bit systems is that one constructor should be reserved for having >246 constructors, in which case another word of memory could be utilized for the constructor code. In fact, you'd only need to use that extra word if the particular constructor exceeds 246. In 64 bit systems, the constructor count could easily be increased by a few bits, with the same backup mechanism for when you have more than X constructors (X being the maximum number of constructors).
Regards,
Yotam