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.