[Issue 1528] [tdpl] overloading template and non-template functions
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Mar 14 09:01:52 PDT 2013
http://d.puremagic.com/issues/show_bug.cgi?id=1528
--- Comment #26 from Kenji Hara <k.hara.pg at gmail.com> 2013-03-14 09:01:49 PDT ---
(In reply to comment #24)
> (In reply to comment #23)
>
> I think this rule is problematic for the function vs. deduced parameter case.
>
> // vs deduced parameter
> int f3(int a) { return 1; }
> int f3(T)(T b) { return 2; }
> f3(1L);
>
> With first overload version,
> Phase 1: normal function is treated as having empty template parameter list, so
> matching is always exact ==> MATCHexact
> Phase 2: int <- 1L == MATCHconvert ==> MATCHconvert
>
> With second overload version,
> Phase 1: T <- typeof(1L) = long ==> MATCHconvert
> Phase 2: T <- 1L == MATCHexact ==> MATCHexact
>
> - the current implementation in the pull request chooses
> the function whereas comment #13 and #16 suggest to go
> with the function template
>
> https://github.com/9rnsr/dmd/blob/b141e29e29b1ec43873c7e0374d27d3fbbae8085/test/runnable/overload.d#L216
> https://github.com/9rnsr/dmd/blob/b141e29e29b1ec43873c7e0374d27d3fbbae8085/test/runnable/overload.d#L279
>
> - C++ chooses the function template
>
> - For me it's counterintuitive to call with conversion when an exact
> match can be instantiated. Even an ambiguous error seems more reasonable to
> me.
Right now I think that was little bad example.
Ques. Why f3(1L) chooses non-template version?
Short Ans. Because the given argument 1L is a literal.
Long Ans.
In D, literals works as like polysemous value. 1L is implicitly convertible to
int by Value Range Propagation, so it matchs with MATCHconvert.
If you give a runtime long value to f3:
long n;
f3(n);
With first overload version,
Phase 1: normal function is treated as having empty template parameter list, so
matching is always exact ==> MATCHexact
Phase 2: int <- n == MATCHnomatch (changed!!)
With second overload version,
Phase 1: T <- typeof(1L) = long ==> MATCHconvert
Phase 2: T <- 1L == MATCHexact ==> MATCHexact
So it will choose template version. How about?
--
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