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.

Reply via email to