alias this and null reference

Namespace rswhite4 at googlemail.com
Fri Apr 27 11:27:54 PDT 2012


On Friday, 27 April 2012 at 18:19:33 UTC, Jonathan M Davis wrote:
> On Friday, April 27, 2012 18:49:48 Simen Kjaeraas wrote:
>> On Friday, 27 April 2012 at 16:36:04 UTC, Namespace wrote:
>> > By the following code i get a normal Access Violation.
>> > My question is: why? Even if "f0" is null, the object must be
>> > converted to Ref and there i check if the given object is 
>> > null.
>> 
>> When trying to convert f0 to Ref, the compiler has to look in 
>> the
>> vtable for the getRef function. The vtable is in a nonsensical
>> place when the class reference is null, and thus it bails out.
>> 
>> Solution: mark getRef as final.
>
> How about just sticking an assertion in with_ref to verify that 
> it's parameter
> is non-null?
>
> - Jonathan M Davis

I write my Ref struct, and Adam Ruppe wrote his NotNull struct, 
to avoid exactly this.
It's annoying to write "assert(param !is null);" every time 
again; a simple keyword or Ref!(Type) instead of Type is much 
better. But this is my opinion.

That is, how I handle the "null this" assertion now:

mixin template TRef(T) {
	final Ref!(T) getRef() in {
		assert(this !is null, "Object is null!");
	} body {
		return Ref!(T)(this);
	}

	alias getRef this;
}

Work fine so far.


More information about the Digitalmars-d-learn mailing list