On Sunday, 21 August 2016 at 16:31:41 UTC, Andrei Alexandrescu
wrote:
Consider:
void fun(byte);
void fun(int);
fun(b + c);
Does anybody actually do that in the real world? Given the int
promotion rule, such an overload is something i'd flag as always
bug prone and confusing anyway.
With D's current rules, I am more likely to make just the int
version and cast stuff down inside to get user code to compile
more easily. My color.d, for example, has this:
/// Construct a color with the given values. They should
be in range 0
<= x <= 255, where 255 is maximum intensity and 0 is minimum
intensity.
nothrow pure @nogc
this(int red, int green, int blue, int alpha = 255) {
// workaround dmd bug 10937
if(__ctfe)
this.components[0] = cast(ubyte) red;
else
this.r = cast(ubyte) red;
this.g = cast(ubyte) green;
this.b = cast(ubyte) blue;
this.a = cast(ubyte) alpha;
}
Just because I got sick of constantly doing the casts on the user
side. VRP is brilliant in little cases, but the fact that it
doesn't work across statements really hurts it in real world use.
These casts are arguably wrong, defeating the point of the no
implicit narrowing rule, but when a rule is so annoying that you
hack around it, it has already failed.