Express "Class argument may not be null" ?

Andre Kostur via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Aug 8 13:00:16 PDT 2017


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).


More information about the Digitalmars-d-learn mailing list