Null references (oh no, not again!)
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Wed Mar 4 16:31:01 PST 2009
Christopher Wright wrote:
> BCS wrote:
>> Hello Walter,
>>
>>> Andrei suggests making a library type work for this rather than a
>>> language attribute, but it's still an extra thing that will have to be
>>> specified everywhere where used.
>>>
>>
>> I've considered trying to make a template that compile time enforces
>> Non-null usage but can, with a version flag, be switched to a simple
>> alias/typedef of the internal type. Near zero overhead and possibly
>> just as strong a guard.
>
> It's impossible.
>
> You can create a struct that will throw an exception if you use it
> uninitialized, or if you try assigning null to it. But the struct cannot
> require that it is initialized.
>
> You can add a contract that requires the struct be initialized, and put
> the contract and declaration in a template.
It is possible (I have one hanging out in my code somewhere). It works
like this:
struct NonNull(T) if is(T == class)
{
T value = cast(T) &NullObject!(T);
...
alias value this; // does not compile yet
}
Constructing a null object is not hard - you can do it with static
this() code, I forgot exactly how I did it.
But this kind of code is not terribly useful, it initializes "null"
objects to correct objects. Instead of getting a hard error, you end up
having odd behavior because you're using that object.
One step forward would be to assign all functions in T's vtable to
throw-everything (make T a white hole object). Still fields will be
changeable.
Andrei
More information about the Digitalmars-d
mailing list