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.

Reply via email to