Function IntrusivePtr.opCastImpl

Cast this to different type To when isIntrusivePtr!To.

To opCastImpl(To, This)() scope
if (isIntrusivePtr!To && !is(This == shared));

BUG

qualfied variable of struct with dtor cannot be inside other struct (generated dtor will use opCast to mutable before dtor call ). opCast is renamed to opCastImpl

Examples

static struct Foo{
    ControlBlock!(int, int) c;
    int i;
    alias i this;

    this(int i)pure nothrow @safe @nogc{
        this.i = i;
    }
}

import std.conv;

IntrusivePtr!Foo x = IntrusivePtr!Foo.make(123);
assert(x.useCount == 1
);
auto y = cast(IntrusivePtr!(const Foo))x;
//debug assert(x.useCount == 2, x.useCount.to!string);
assert(x.useCount == 2);


auto z = cast(const IntrusivePtr!Foo)x;
assert(x.useCount == 3);

auto u = cast(const IntrusivePtr!(const Foo))x;
assert(x.useCount == 4);