unsigned policy

Bradley Smith digitalmars-com at baysmith.com
Wed Feb 7 22:46:02 PST 2007


Andrei Alexandrescu (See Website For Email) wrote:
> Henning Hasemann wrote:
>> I know this is a more general questions as it applies to C and C++ as 
>> well,
>> but somewhere I have to ask and actually D is what Im coding in:
>>
>> Should one try to use uint in favor of int whenever one knows for sure 
>> the value
>> wont be negative? That whould be a bit more expressive but on the 
>> other hand
>> sometimes leads to type problems.
>> For example, when having things like this:
>>
>> T min(T)(T a, T b) {
>>   return a < b ? a : b;
>> }
>>
>> Here you whould need to ensure to cast values so they share a common 
>> type.
>>
>> How do you code? Do you use uint whenever it suitable reflects the 
>> data to
>> store (eg a x-y-position on the screen) or only when necessary?
> 
> Current D botches quite a few of the arithmetic conversions. Basically 
> all conversions that may lose value, meaning, or precision should not be 
> allowed implicitly. Walter is willing to fix D in accordance to that 
> rule, which would yield an implicit conversion graph as shown in:
> 
> http://erdani.org/d-implicit-conversions.pdf
> 
> Notice that there is no arrow e.g. between int and uint (loss of 
> meaning), or between int and float (loss of precision). But there is an 
> arrow from int and uint to double, because double is able to represent 
> them faithfully.
> 
> If we are nice, we may convince Walter to implement that soon (maybe in 
> 1.006?) but it must be understood that the tighter rules will prompt 
> changes in existing code.
> 
> To answer your question, with the new rules in hand, using unsigned 
> types will considerably increase your expressiveness and your ability to 
> detect bugs statically. Also, by the new rules ordering comparisons 
> between mixed-sign types will be disallowed.
> 
> 
> Andrei

Does this mean that int would no longer implicitly convert to bool?
For example, the following would not longer compile.

   int i = 1;
   if (i) {}

This would instead give an error something like "no implicit conversion 
from int to bool".

If this were the case, wouldn't it make the expression (a < b < c) 
illegal, as is being discussed in another thread. Since "a < b" would 
result in a bool, but bool < int is not a legal comparison.

Thanks,
   Bradley




More information about the Digitalmars-d mailing list