1 matches bool, 2 matches long

Walter Bright newshound2 at digitalmars.com
Fri Apr 26 14:34:45 PDT 2013


On 4/26/2013 1:59 PM, Diggory wrote:
> The actual value shouldn't be taken into
> account when determining which overload to call, only the type should matter,

D has an interesting feature called VRP (value range propagation), where 
implicit conversion very much depends on the value. For example:

ubyte b;
b = 100;    // ok
b = 300;    // error

This has been very successful in reducing the noise of having to insert casts 
all over the place.

For:

enum e = 1;

then e is a value that is known to be one. Hence VRP applies, and it can be 
implicitly cast to bool, ubyte, short, etc. For:

static e = 1;

the compiler cannot assume that e is always 1, hence e is treated as an int that 
could hold any value. Hence, it cannot be implicitly cast to bool, ubyte, short, 
etc.


 > Ideally such an implicit conversion would only apply if it was the only 
possible valid implicit conversion,

This was how D originally worked. However, it produced a list of foolish errors, 
and a lot of complaints. The current scheme attempts to resolve ambiguities by 
doing a "partial ordering" (described elsewhere in this thread). This has been 
very successful.

To make use of overloading, there's no avoiding understanding this. A program 
that breaks due to different overloadings of:

     enum e = 1;
     static x = 1;

is misusing overloading just like one that breaks on different overloads of:

     enum e = 30000;
     static x = 40000;

I.e.:

     void foo(short) { ... back up my files ... }
     void foo(long) { ... launch nuclear missiles ... }

is a bad program.


More information about the Digitalmars-d mailing list