I don't get it. version(unittest) can't seem to use local variable

Ali Çehreli via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Jul 12 21:20:06 PDT 2014


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



More information about the Digitalmars-d-learn mailing list