Andrei Alexandrescu wrote:
Walter Bright wrote:
The problem with non-nullable references is what do they default to?
Some "nan" object? When you use a "nan" object, what should it do?
Throw an exception?
This is the mistake. There would no way to default initialize a non-null
object. I'm surprised you are still saying this, because we discussed
how NonNull!T could be implemented by disabling its default constructor.
Sure, so the user just provides "0" as the argument to the non-default
constructor. Or he writes:
C c = c_empty;
using c_empty as his placeholder for an empty object. Now, what happens
with:
c.foo();
? Should c_empty throw an exception? To take this a little farther,
suppose I wish to create an array of C that I will partially fill with
valid data, and leave some empty slots. Those empty slots I stuff with
c_empty, to avoid having nulls. What is c_empty's proper behavior if I
mistakenly try to access its members?
Forcing the user to provide an initializer does not solve the problem.
The crucial point is the problem is *not* the seg fault, the seg fault
is the symptom. The problem is the user has not set the object to a
value that his program's logic requires.
I am also perfectly happy with NonNull being a type constructor, to be
used where appropriate. My disagreement is with the notion that null
references should be eliminated at the language level.