On 8/8/17 4:00 PM, Andre Kostur wrote:
On 2017-08-08 12:38 PM, Steven Schveighoffer wrote:
On 8/8/17 2:56 PM, ag0aep6g wrote:
On 08/08/2017 08:34 PM, Johan Engelen wrote:
How would you express the function interface intent that a reference to a class may not be null? For a function "void foo(Klass)", calling "foo(null)" is valid. How do I express that that is invalid? (let's leave erroring with a compile error aside for now)


Something equivalent to C++'s pass by reference: "void foo(Klass&)".
[snip]

But you can pass null in a ref parameter:

----
void f(ref int x) @safe {}
void main() @safe
{
     int* p = null;
     f(*p);
}
----

Note that C++ also can do this, so I'm not sure the & is accomplishing the correct goal:

void foo(Klass&);

int main()
{
    Klass *k = NULL;
    foo(*k);
}

However, the in contract does actually enforce the requirement.

To be fair: it cannot be done in C++ without first invoking Undefined Behaviour (such as dereferencing a nullptr).

If your "insurance" that null pointers aren't passed is the threat of undefined behavior, then it leaves a lot to be desired.

It's possible, and does happen. The "just don't write bugs" approach doesn't scale.

-Steve

Reply via email to