On 07/12/2014 08:37 PM, H. S. Teoh via Digitalmars-d-learn wrote:

> ref makes it possible for the caller to modify the pointer returned by
> the callee. For example:
>
>    class D { int x; }
>    class C {
>            D d;
>            this(D _d) { d = _d; }
>            ref D getPtr() { return d; }
>    }
>    auto d1 = new D;
>    auto d2 = new D;
>    auto c = new C(d1); // c.d now points to d1
>    assert(c.getPtr() is d1); // getPtr returns d1
>    c.getPtr() = d2; // this modifies c.d
>    assert(c.getPtr() is d2); // getPtr now returns d2
>
> If you do not wish the caller to do this, remove the ref from the
> function signature.

The twist here is that the OP's function returned 'this' by reference. Changing that not only not have any effect on the object, it would also be undefined behavior because 'this' is a local variable in that use.

class C {
    ref C getPtr() { return this; }
}

void main()
{
    auto c = new C();
    assert(c.getPtr() is c);

    c.getPtr() = new C();    // modifying dead variable
    assert(c.getPtr() is c); // no effect
}

Ali

Reply via email to