On Tuesday, 2 June 2015 at 05:07:43 UTC, Andrei Alexandrescu wrote:
On 6/1/15 9:46 PM, deadalnix wrote:
No, I asked you what is the rationale used to get types with
postblit/destructor in unions (right now, the spec says no). I asked about the rationale for introduction of element with destructor/copy constructor in C++, but it turns out that the link provided also include constructor, and, in fact, only explore the constructor case in the
rationale.

From http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2248.html:

========
Unfortunately this brute-force approach cannot be extended to every user-defined type that a programmer might want to pass around transparently. As class types, unions are definitely second class: although a union may define a constructor and destructor for instances of its type, the standard does not allow it to contain any member whose default constructor, copy constructor, copy assignment operator, or destructor are non-trivial. The reason for these tight restrictions is obvious -- the compiler can hardly be expected to generate sensible default special member functions for an object whose type will only become known at run time, and therefore a "lowest-common-denominator" policy applies. With the rules in place, default initialization is effectively a no-op, likewise destruction, and copying is performed using a low-level memcpy.

This rules out the inclusion of "interesting" types, or else requires the programmer to ignore good design practice in order to make them conform to the straightjacket of trivial types (see discussion in N2172).

And yet the need for a "variant" data structure that can hold one object of a set of unrelated types is a problem that arises over and over [...]
========

There are others to be found in related docs. The simple explanation is that non-discriminated unions are most useful as unstructured bags that allow their users to plant their own types in whilst keeping their discriminant elsewhere. Planting either gratuitous restrictions on the storable data, or smarts regarding construction and destruction, simply reduces the range of things that unions are good at.

I don't know how to explain this better.


It is unfortunate that the explanation do not go over the constructor but no desturctor case (way more common in D than in C++). I think the case is not as strong for D, as a we already allow struct with constructor, contrary to C++ when this document was done. Still probably the right way forward, granted this is @system. When you are in union land, you are pretty much on your own anyway.

Reply via email to