Implicit conversion rules

Sigg via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Oct 21 12:37:43 PDT 2015


On Wednesday, 21 October 2015 at 19:07:24 UTC, anonymous wrote:

> The problem is of course that int and ulong have no common 
> super type, at least not in the primitive integer types. int 
> supports negative values, ulong supports values greater than 
> long.max.

Yes, I'm well aware of that. I was under the (wrongful)impression 
that auto was doing much more under the hood and that it was more 
safety oriented, I've prolly mixed it with something else while 
reading some article.

> As far as I understand, you'd like the compiler to see the 
> values of `a` and `b` (-10, 0), figure out that the result is 
> negative, and then make `c` signed based on that. That's not 
> how D rolls. The same code must compile when the values in `a` 
> and `b` come from run time input. So the type of the addition 
> cannot depend on the values of the operands, only on their 
> types.
>
> Or maybe you'd expect an `auto` variable to be able to hold 
> both negative and very large values? But `auto` is not a 
> special type, it's just a shorthand for typeof(right-hand 
> side). That means, `auto` variables still get one specific 
> static type, like int or ulong.

Ima clarify what I expected using my previous example:

     ulong a = 0;
     int b = -10;
     auto c = a + b;

a gets cast to narrowest primitive type that can hold its value, 
in this case bool since bool can hold 0 value resulting in c 
having value of -10. If a was bigger than max long I'd expect an 
error/exception. Now on the other hand I can see why something 
like this would not be implemented since it would ignore implicit 
conversion table and prolly cause at least few more "fun" side 
effects.

> std.bigint and core.checkedint may be of interest to you, if 
> you prefer safer operations over faster ones.
>
> http://dlang.org/phobos/std_bigint.html 
> http://dlang.org/phobos/core_checkedint.html

This is exactly what I was looking for. Thanks!



More information about the Digitalmars-d-learn mailing list