On 11/12/18 4:45 AM, Mike Parker wrote:
DIP 1015, "Deprecation and removal of implicit conversion from integer
and character literals to bool, has been rejected, primarily on the
grounds that it is factually incorrect in treating bool as a type
distinct from other integral types.
The TL;DR is that the DIP is trying to change behavior that is working
as intended.
From Example A in the DIP:
bool b = 1;
This works because bool is a "small integral" with a range of 0..1. The
current behavior is consistent with all other integrals.
But it's not consistent:
void isItAnInteger(T, bool makeCompile = false)() // works for all integers
{
T val = T.min; // I was surprised these work for bool
val = T.max;
static if(!makeCompile)
{
long x = -val; // Error: operation not allowed on bool b
++val; // Error: operation not allowed on bool val += 1
val += 1; // same error
}
val = cast(T)(T.max + 1);
assert(val == val.min); // error for bool, true + 1 == 2, but
cast(bool)2 truncates to true, not false.
}
void main()
{
import std.meta;
static foreach(T; AliasSeq!(int, uint, long, ulong, short, ushort,
byte, ubyte))
{
isItAnInteger!T();
}
// switch second parameter to false to see compiler errors.
isItAnInteger!(bool, true)();
}
If you have the makeCompile flag set to true, then it asserts for bool,
but nothing else.
-Steve