> ... > > I see that neither the constructor nor the postblit is called. > Apparently the bit representation is used. This has the risk of > violating struct invariants. > > Is it legal? > > Thank you, > Ali
cast is to value conversions what a tactical nuclear strike is to peaceful negotiations. cast is specifically *designed* to circumvent the type system's protections [1]. If you want to do a value conversion, *do a value conversion*. Allocate a new array and convert each member. cast doesn't call the constructor or the postblit because it's doing a pointer conversion. Your code is basically equivalent to this: void main() { auto tmp = "hello"d; auto mine = cast(MyChar*)(tmp.ptr) [0..(tmp.length*typeof(tmp[0]).sizeof)/MyChar.sizeof)]; } That is, it's doing an unsafe, unchecked pointer cast, then re-slicing the array. To answer your question: yes, it's legal. Not what you wanted, but legal. [1] Except for int<->float. Oh, and objects. Really, this is one thing I could just about strangle K&R for: conflating value-preserving, non-value-preserving *AND* unsafe conversions all into a single construct. Walter, gets slapped with a fish for not putting a bullet in cast's head when he had the chance. Argh!