On Thursday, 7 July 2016 at 09:40:57 UTC, Lodovico Giaretta wrote:
Initially it looks very surprising, but then if you add `writeln(B.init.col[]);` you can easily find out what's going on.

And I'm quite sure it's expected behaviour.

An RBTree is just a pointer to the memory containing the actual tree. Your `col`s have different addresses because they are different copies of the same pointer. If you cast `col` to a pointer and write the address it's pointing at, you find out that the two structures are pointing to the same memory.

This is because assignments used in a structure declaration are not re-executed for each instantiation. Instead, they are executed one to create the `.init` member of the type, which is then bit-copied on every other instance. So your code does this:

B.init.col = new RBTree(...);

B b1 = B.init;
B b2 = B.init;

Reply via email to