Why D const is annoying
David Nadlinger
see at klickverbot.at
Sat Dec 10 04:15:39 PST 2011
On 12/10/11 12:11 PM, Walter Bright wrote:
> That's because
>
> Matrix!(int, cast(int)1)
>
> is considered a different template instantiation (and hence a different
> type) from
>
> Matrix!(int, cast(uint)1)
>
> Instantiation types are based on the arguments' types, not the
> parameters' types.
Which is, in my not-so-humble opinion, just plain broken. Template value
parameters are, well, values, and there is no way there can ever be a
difference between whether a value of an integral type represents 1 or 1u.
This is a long-standing bug, and makes unsigned template value
parameters and, to a lesser extent, integral template value parameters
in general virtually unusable, because you hit hard-to-debug issues with
confusing error messages all over the place.
It gets even worse once CTFE comes into play (or compile-time values in
general, as opposed to directly passing number literals) for two
reasons: First, the error messages become totally useless, that is
something similar to »Foo!(n) can't be implicitly converted to Foo!(n)«.
Second, even if you litter your code with explicit casts all over the
place, it is not really possible to get it to behave like intended
because of what I presume constant-folding issues.
I know this first hand, because I worked on a units-of-measurement
library which relies on units being uniquely represented as types
because the unit type becomes part of the type of quantities as a
template parameter (I presented it at the NG a while back, by the way:
http://www.digitalmars.com/d/archives/digitalmars/D/RFC_Units_of_measurement_for_D_Phobos_134590.html).
For derived units (e.g. kg m/s^2), you need compile time rational
arithmetic, which was really hard to get to work because of the issue
discussed here (I don't even remember all the details). But even with my
own unit tests passing, I once in a while get a message saying something
like: Hey, I checked out your units library prototype, and while it
works nice for most cases, I encountered this situation where … [some
situation in which 1 != 1 for DMD]. I tried really hard to work around
this, but I couldn't find a reliable solution.
Also, I'd like to note that I am not alone with this opinion; Don,
Kenji, Jonathan among others agree that the current behavior is
confusing. A few reports of this issue (and related ones):
http://d.puremagic.com/issues/show_bug.cgi?id=3467
http://d.puremagic.com/issues/show_bug.cgi?id=2257
http://d.puremagic.com/issues/show_bug.cgi?id=2550
Kenji even came up with a fix in form of a pull request, which you
turned down without explanation:
https://github.com/D-Programming-Language/dmd/pull/449
So, could you please at least elaborate why you think the current
behavior is correct, and what advantages it has to outweigh the massive
confusion it causes?
Thanks,
David
More information about the Digitalmars-d
mailing list