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