On Thursday, 22 March 2018 at 20:25:28 UTC, jmh530 wrote:
On Wednesday, 21 March 2018 at 14:04:58 UTC, Adam D. Ruppe
wrote:
In Simen's example, the child information is not available at
compile time. This line here:
A a = new B();
discards the static type. The compiler could probably cheat
and figure it out anyway in this example, but suppose:
[snip]
There are a few interesting things in the class destructor part
of the spec.
For instance:
"There can be only one destructor per class, the destructor
does not have any parameters, and has no attributes. It is
always virtual."
Reality is very different. The __ctbl is NOT USED AT ALL to call
the __dtor.
If the destructor has no attributes, how can it be @nogc?
Also:
"The destructor for the super class automatically gets called
when the destructor ends. There is no way to call the super
destructor explicitly."
Reality is different. One can play with the __dtor member.
This is what i do in IZ.
- `destruct!(MyDerived)(myDerived)`: this has for effect to trust
the static type that's passed to destruct(). That way destruct
can be really @nogc.
- `destruct!(Object)(cast(Object)myDerived)`: this has for effect
to use the dunamic type (i.e with typeid() i get the type info
that contains a pointer to the __dtor, which CANT be @nogc. This
is equivalent to official destroy().
In both case i also use a mixin called `inheritedDtor` which,
contrary to what is stated in the specs, allowd to call
explicitly the super __dtor.
I don't say that's the solution. I think there's no solution.
What i do is not clean. It only works with displine and inside a
particular library.
I'm gonna post a DUB script as POC later.