Unexpectedly nice case of auto return type

Basile B. b2.temp at gmx.com
Wed Dec 4 09:16:51 UTC 2019


On Tuesday, 3 December 2019 at 10:19:02 UTC, Jonathan M Davis 
wrote:
> On Tuesday, December 3, 2019 3:03:22 AM MST Basile B. via 
> Digitalmars-d- learn wrote:
>> On Tuesday, 3 December 2019 at 09:58:36 UTC, Jonathan M Davis
>>
>> wrote:
>> > On Tuesday, December 3, 2019 12:12:18 AM MST Basile B. via
>> >
>> > Digitalmars-d- learn wrote:
>> >> I wish something like this was possible, until I change the 
>> >> return type of `alwaysReturnNull` from `void*` to `auto`.
>> >>
>> >>
>> >> ---
>> >> class A {}
>> >> class B {}
>> >>
>> >> auto alwaysReturnNull() // void*, don't compile
>> >> {
>> >>
>> >>      writeln();
>> >>      return null;
>> >>
>> >> }
>> >>
>> >> A testA()
>> >> {
>> >>
>> >>      return alwaysReturnNull();
>> >>
>> >> }
>> >>
>> >> B testB()
>> >> {
>> >>
>> >>      return alwaysReturnNull();
>> >>
>> >> }
>> >>
>> >> void main()
>> >> {
>> >>
>> >>      assert( testA() is null );
>> >>      assert( testB() is null );
>> >>
>> >> }
>> >> ---
>> >>
>> >> OMG, isn't it nice that this works ?
>> >>
>> >> I think that this illustrates an non intuitive behavior of 
>> >> auto
>> >> return types.
>> >> One would rather expect auto to work depending on the inner
>> >> return type.
>> >
>> > The void* version doesn't work, because void* doesn't 
>> > implicitly convert to a class type. It has nothing to do 
>> > with null. auto works thanks to the fact that typeof(null) 
>> > was added to the language a while back, and since class 
>> > references can be null, typeof(null) implicitly converts to 
>> > the class type. Before typeof(null) was added to the 
>> > language, null by itself had no type, since it's just a 
>> > literal representing the null value for any pointer or class 
>> > reference. The result was that using null in generic code or 
>> > with auto could run into issues. typeof(null) was added to 
>> > solve those problems.
>> >
>> > - Jonathan M Davis
>>
>> That's interesting details of D developement. Since you reply 
>> to the first message I think you have not followed but in the 
>> last reply I told that maybe we should be able to name the 
>> type of null. I think this relates to TBottom too a bit.
>
> There isn't much point in giving the type of null an explicit 
> name given that it doesn't come up very often, and typeof(null) 
> is quite explicit about what the type is. Also, anyone doing 
> much generic programming in D is going to be well versed in 
> typeof. They might not know about typeof(null) explicitly, but 
> they should recognize what it means when they see it, and if 
> someone were trying to get the type of null, it would be the 
> obvious thing to try anyway. And typeof(null) isn't even the 
> prime case where typeof gets used on something other than an 
> object. From what I've seen, typeof(return) gets used far more.
>
> As for TBottom, while the DIP does give it a relationship to 
> null, they're still separate things, and giving typeof(null) a 
> name wouldn't affect TBottom at all.
>
> - Jonathan M Davis

I think that any internal compiler types that are also things in 
code should be named.
Things like tuples are really a thing in the compiler (TupleExp, 
TypeTuple, also Tuple in dtemplate.d, ...), we still need a 
library type for tuples while everything there in the compiler.


More information about the Digitalmars-d-learn mailing list