Optional type - how to correctly reset a wrapped immutable T
SimonN
eiderdaus at gmail.com
Tue Mar 27 15:17:48 UTC 2018
On Monday, 26 March 2018 at 14:17:03 UTC, Jonathan M Davis wrote:
> Rebindable does is pretty questionable as far as the type
> system goes, but it does what it does by forcing pointer
> semantics on a class reference, so the point is arguable.
Yeah, I've always assumed that Rebindable cannot be implemented
without internally breaking the type system, then exposing a safe
interface.
But this sparked my interest, I've dug out the Rebindable code:
private mixin template RebindableCommon(T, U, alias This)
if (is(T == class) || is(T == interface) ||
isAssociativeArray!T)
{
private union
{
T original; // e.g., immutable(A) for classs A
U stripped; // the unqualified type, e.g., A
}
// ...
}
Does Rebindable-using code, oblivious of the hacks inside
Rebindable, remain 100 % safe even with aggressive compiler
optimizations? For class A, inside Rebindable!(immutable A),
there is a union of (immutable A) and A. I suspect that the D
compiler is allowed to treat this reference to (immutable A) as
immutable itself. Have there never been bugs here when, later,
stripped = another.stripped;?
-- Simon
More information about the Digitalmars-d-learn
mailing list