On Thursday, 22 June 2017 at 19:17:13 UTC, Ali Çehreli wrote:
No time to think about the rest of the design but just to get the code compiled, replace 'ref' with 'auto ref' like so:

    this(DT)(scope auto ref UniquePtr!DT rhs)
    {
        // ...
    }

Ali

i added this static variable:

static int destcalls = 0;

changed constructor to:

    this(DT)(scope auto ref UniquePtr!DT rhs)
    {
        // here rhs releases pointer
        pragma(msg, typeof(rhs));
    }

wich prints "UniquePtr!(B)" on my machine,
and destructor:

    ~this() { destcalls++; }

Following code compiles and runs ok:

    class A {}
    class B: A {}
    UniquePtr!A a = UniquePtr!A.make();
    assert(destcalls == 0);
    UniquePtr!A b = UniquePtr!B.make();
    assert(destcalls == 1);

Destructor is called for the result of "UniquePtr!B.make();", and if it actually was passed by value (wich is indicated by pragma's output), b's internal pointer would refer to freed heap block.

Reply via email to