copy-ctor's
RazvanN
razvan.nitu1305 at gmail.com
Mon May 27 09:06:30 UTC 2019
On Saturday, 25 May 2019 at 23:15:05 UTC, Manu wrote:
> So, it seems that if an object has a postblit and a copy
> constructor, the postblit is preferred.
>
> It also seems that if an object has a copy constructor and a
> MEMBER with a postblit, then object has a postblit generated
> which calls through to the member, and that is preferred.
>
> I have also noticed that if you have a union containing an item
> with a postblit, the postblit is always called, even if the
> item in the union is not valid:
>
That's a bug, but I think that it's not going to be fixed since
the postblit
should be deprecated soon.
> struct S(T)
> {
> union {
> int x = 0;
> T y = void;
> }
> bool isT = false;
> }
>
> S a;
> S b = a; // calls `y's postblit, even though it's `isT` is
> false and
> the object is `void` initialised...
>
> So, it's very hard to craft a tool like 'S', when the supplied
> T might have a postblit and ruin everything. What are my
> options here?
>
Currently, you don't have any options. As I see it, there are 3
possible solutions:
1. Change the semantics of `disable this(this)` from "object is
not copyable"
to "object is not copyable through postblit". This way we can
exclude postblits
but allow copies using the copy constructor.
2. Check if T has postblit with a static if (via traits) and
define the copy
constructor only if T does not have a postblit.
3. Issue a deprecation if T has a postblit.
Essentially, there is no clear way in how you can mix object with
postblits and objects with copy constructor
> Also, `hasElaborateCopyConstructor` is broken now. It should
> know about copy ctor's.
More information about the Digitalmars-d
mailing list