On Friday, 19 May 2017 at 18:10:50 UTC, H. S. Teoh wrote:
On Fri, May 19, 2017 at 05:48:55PM +0000, Stanislav Blinov via Digitalmars-d wrote:
On Friday, 19 May 2017 at 17:05:09 UTC, H. S. Teoh wrote:
[...]
> AFAIK, there is no way to clone classes, unless the class > writer implemented it explicitly. Only arrays support .dup, > no other type does (unless user code explicitly implements > it, or its equivalent). > > > T

Well, not that it's a complete implementation or anything, but it definitely could be done with a library:

/// Make a shallow clone of a class instance
/// (members that are classes are not cloned)
[...]

That's the problem right there: you cannot guarantee that a shallow copy will have the correct semantics. For example, modifying a class member through the original copy will also modify what is seen through the clone, which may not be the intention.

That's true.

Also, you have to take care that if the class member is ref-counted, the clone function needs to increment the refcount, otherwise you could end up with a dangling pointer.

It does call postblits. But of course, a complete implementation should do more than that. It probably has to lock the monitor for the duration, correctly annotate the GC block if memory is being GC-allocated, etc...

Meaning, in the general case, you need to be careful about calling postblits and such.

Furthermore, a generic deep-copying clone function may not be possible in the general case...

Of course. For such cloning to be officially supported by the language, at least one additional primitive is needed: __postblit for classes. This will let user code correctly handle cloning as needed. Surely, a much better solution would be actual owning/non-owning pointers and references, but I doubt we'd ever get there.

Reply via email to