<p>This is a lack of fixing bug 6208.<br>
Now I'm creating a patch...</p>
<p>Kenji Hara</p>
<div class="gmail_quote">2012/02/11 19:58 "Martin Nowak" <<a href="mailto:dawg@dawgfoto.de">dawg@dawgfoto.de</a>>:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
// I.<br>
void foo(V)(in V v)<br>
{<br>
}<br>
<br>
// II.<br>
void foo(Args...)(auto ref const Args args)<br>
{<br>
    foo(args[0]);<br>
}<br>
<br>
void main()<br>
{<br>
    foo(10);<br>
}<br>
<br>
-----<br>
<br>
Deducing foo(10)<br>
function arguments: rvalue int<br>
I.  - MATCHconst<br>
II. - MATCHexact<br>
<br>
picks II<br>
<br>
-----<br>
<br>
Deducing foo(args[0])<br>
function arguments: lvalue const(int)<br>
I.  - MATCHexact<br>
II. - MATCHexact<br>
<br>
This is further disambiguated by leastAsSpecialized.<br>
template.c(895):<br>
        /* A non-variadic template is more specialized than a<br>
         * variadic one.<br>
         */<br>
        if (isVariadic() && !td2->isVariadic())<br>
<br>
picks I<br>
<br>
-----<br>
<br>
We end up instantiating both functions with the same argument types.<br>
Thus the mangling is the same and the linker will pick whatever he likes.<br>
<br>
1. I think that variadic templates shouldn't be exact matches.<br>
2. We shouldn't use tiebreakers but issue ambiguous errors.<br>
<br>
A quick fix would be to change variadic templates to MATCHconvert as in the attached patch.<br>
But I think we should reduce the complexity of template matching rather than patching it.<br>_______________________________________________<br>
dmd-beta mailing list<br>
<a href="mailto:dmd-beta@puremagic.com">dmd-beta@puremagic.com</a><br>
<a href="http://lists.puremagic.com/mailman/listinfo/dmd-beta" target="_blank">http://lists.puremagic.com/mailman/listinfo/dmd-beta</a><br></blockquote></div>