On 06/30/2017 07:38 AM, Ecstatic Coder wrote:
I'm just against putting it on by default, so that the current behavior is kept, because I don't see where is the language improvement in having to put these ugly manual conversion everywhere just because the string/array length was made unsigned.

So what you really want is: signed array lengths. You only have a use for the sloppy conversion, because D doesn't have signed array lengths.

I always use signed integers for string/array indices because unsigned indices become dangerous as soon as your algorithm starts to decrement it...

I guess they're "dangerous" because you get ulong.max instead of (a signed) -1? But that's exactly what happens with the implicit conversion, too.

At some point you have to think of that. Either when adding/subtracting or when comparing signed with unsigned. With a warning/error on the implicit conversion, you'd get a nice reminder.

By the way, std.experimental.checkedint may interesting:

----
import std.experimental.checkedint: checked, ProperCompare,
    Saturate;

/* If negative values should not occur, throw an error on wrap
around: */
auto x = checked(size_t(0));
--x; /* error */

/* Or stop at 0: */
auto y = checked!Saturate(size_t(0));
--y; /* does nothing */
assert(y == 0); /* passes */

/* If negative values are valid, you can use proper comparisons
without sloppy implicit conversions or verbose manual ones: */
auto z = checked!ProperCompare(int(-1));
auto array = [1, 2, 3];
assert(z < array.length); /* passes */
----

Reply via email to