On Thu, 25 Apr 2013 23:01:30 -0700, Walter Bright <newshou...@digitalmars.com> wrote:

D tries very hard to avoid the notion of a "better" match. It goes with an exact match, followed by one with implicit conversions. All implicit conversions are considered equally good. Ambiguity is resolved by invoking "partial ordering", which was explained elsewhere in this thread. Partial ordering does not at all consider "better" matches.

I think the issue (and I am firmly in the foo(1) => long camp) is that bools are considered better integers than actual integer types (or even floating point types for that matter). I agree that bools can be implicitly cast to and from integers, as a last resort.

Once you venture down the path of "better" matches, it's all roses at first, but look at where C++ wound up with it. It didn't intend to arrive there, it inevitably arrived there.

bool is true or false. It can be interchangeable with 0 or 1. But if it's overloaded with an integral or otherwise numeric type (float, double, etc), then the numeric type should be chosen first, or ambiguity flagged (your choice). The current behavior is as bad as if(); That's not ambiguous, and follows the grammatical rules, why does that deserve a special case and this not?

The real issue is do you want to have the implicit conversions:

0 => false
1 => true

or would you require a cast?

This is irrelevant to the problem. If one wants to pass a boolean literal, they would use true or false, not cast(bool)1 or cast(bool)0. When an implicit cast must be done, and overload selection is at stake, bool should be last on the list of numeric types.

I think you are incorrectly making this into a "it has to be this way for consistency" issue, it's not. It's an arbitrary rule, with very little sense involved.

-Steve

Reply via email to