On 10/29/21 1:05 AM, Dom DiSc wrote:

> I recommend to implement your own abs function this way (was not
> accepted for phobos, as it now does NOT return the same type as the
> argument, which was considered a "breaking change" :-( ):

Combined with automatic type conversions we got from C, it can cause unexpected results as well. One might expect the following program to print -1 when that definition of abs() is used in an expression:

import std.traits;
import std.stdio;

/// get the absolute value of x as unsigned type. always succeeds, even for T.min
Unsigned!T abs(T)(const(T) x) if(isIntegral!T)
{
   static if(isSigned!T) if(x < 0) return cast(Unsigned!T)-x;
   return x;
}

void main() {
  int a = -5;
  int b = -4;
  writeln(a + abs(b)); // -5 + 4 == -1? (No!)
}

The program prints uint.max.

Ali

Reply via email to