bearophile wrote:
Don:
That is, if x is a struct, convert "if(x)" into "if(x==0)"
and convert "if(!x)" into "if(x!=0)". Usual rules would then apply, so
any opEquals with a parameter which could be implicitly cast from 0
would work.
That wouldn't allow smart-pointer structs to implement if (x) without
requiring them to allow comparisons with integers, so it might be
necessary to add a second step: try "if(x==null)" instead.
I don't like this solution, because it relies on a bit of invisible magic, and
you too have seen it needs extensions because it's not general.
If you want to use if (x) where x doesn't represent a number but something else like a
collection, they you have to add even more special cases like add a third step:
"if(x.length == 0)" etc. So this is not a good solution.
Currently, if(x) is a shortcut for either:
if (x != 0)
OR
if (x !is null)
depending on whether x is a value or a reference type. It never means
anything else. I think it should stay that way.
That is, if it is not legal to check it for equality with 0, the
shortcut should not exist. And definitely, if "if(x!=0)" is a valid
operation, it should never be different to "if(x)".
BTW, in C++, it only ever means "x!=0", it's only because D treats null
differently from 0 that the two cases exist.