[Issue 3543] : ? operator can't find common type for classes/interfaces

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Apr 6 13:30:23 PDT 2011


http://d.puremagic.com/issues/show_bug.cgi?id=3543



--- Comment #11 from Andrei Alexandrescu <andrei at metalanguage.com> 2011-04-06 13:26:45 PDT ---
(In reply to comment #10)
> (In reply to comment #9)
> > One can always connect an imaginary root to all rootless interfaces and apply
> > the rule I mentioned. Let me add that "?:" is a cornerstone operator for a lot
> > of traits and type deduction paraphernalia (e.g. std.traits.CommonType). I
> > wouldn't insist in the matter if it weren't important beyond the convenience of
> > "?:" itself.
> 
> I agree about the importance of the ?: algorithm. But I wonder if the compiler
> picking a common ancestor from a complex inheritance graph is really a good
> thing - it may prove surprising to the user. For example:
> 
> interface A : B,C,D,E
> interface X : M,N,O,C
> 
> Is it really the right idea to pick C for the common type? I'm skeptical.

Yes, in this case D is unequivocally the common type. A more interesting
example is:

interface A {}
interface B {}
interface C : B {}
interface X : A, C {}
interface Y : A, C {}

By my suggested rule, C would be the common type as it's the most specific
(most remote from a root). At the same time both A and C are equally distanced
from X and Y so it's legitimate to ask on why A is not an equally good fit (and
therefore an ambiguity).

A rule that would avoid that issue would be to count all common ancestors and
find the one that is closest to both, i.e. shortest sum of steps from both
interfaces. I thought of it but eliminated it because it can create rather
subtle distinctions.

I agree the problem is not as clear cut as we'd like. OP?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list