On Monday, 23 January 2017 at 23:04:45 UTC, Ali Çehreli wrote:
On 01/23/2017 02:58 PM, bitwise wrote:
I'm confused about what the rules would be here.

It would make sense to call the postblit if present, but std.Array
currently does not:
https://github.com/dlang/phobos/blob/04cca5c85ddf2be25381fc63c3e941498b17541b/std/container/array.d#L884


Post-blit is for copying though. Moving should not call post-blit. You may want to look at the implementation of std.algorithm.move to see how it plays with post-blit:

  https://dlang.org/phobos/std_algorithm_mutation.html#.move

Ali

That's a good point.

It didn't click at first, but checking for postblit is done with 'hasElaborateCopyConstructor(T)'.

I had thought that what memmove was doing would be considered "blitting", and hence require a postblit afterwards.

I did look at std.move, but was mistaken about which code path was being taken. It seemed like structs that defined only a postblit would have been moved by assignment:

https://github.com/dlang/phobos/blob/366f6e4e66abe96bca9fd69d03042e08f787d040/std/algorithm/mutation.d#L1310

But in actuality, the memcpy branch fires because hasElaborateAssign(T) returns true for structs with a postblit - which was unexpected. I don't really understand why, but this makes things clearer.

  Thanks

Reply via email to