DIP 1015--Deprecation of Implicit Conversion of Int. & Char. Literals to bool--Formal Assement
Walter Bright
newshound2 at digitalmars.com
Wed Nov 14 04:27:05 UTC 2018
On 11/13/2018 7:12 PM, Isaac S. wrote:
> why should an enum
> not convert to its declared type, rather than blindly using its literal value.
> Just using the literal value discards the secondary-type information the
> programmer had given it.
D has the following match levels:
1. exact
2. conversion to const
3. implicit conversion
4. no match
C++, on the other hand, has a long list of match levels, which nobody remembers,
and yet still causes problems (see Scott Meyers). The conversion of `A` to `int`
already drops it to match level 3, from which it will not rise. I.e. the second
level being an exact match with `int` does not help.
The further disambiguation between multiple matching functions is done using
partial ordering. This has NOTHING to do with the arguments. It just looks at:
f(int)
f(short)
and picks f(short) because it is more specialized. This partial ordering is what
C++ does with template functions. It is simpler and more robust than the older
more primitive "match level" system C++ uses for non-template functions. I
suspect that if C++ were to do a "do-over" with function overloading, it would
use partial ordering instead of match levels.
Interestingly, the match level and partial ordering methods almost always
produce the same results.
There have been various attempts over the years to "fix" various things in the D
matching system by adding "just one more" match level. I've rejected all of
them, because things that look simple and obvious with trivial examples tend to
sink in a swamp with the dirty reality of the rather vast number of types and
conversions that D supports. This happens in C++, and what people tend to do is
just throw up their hands and hackishly add in more overloads until they get the
result they want.
More information about the Digitalmars-d-announce
mailing list