<div dir="ltr"><div>This is a compiler bug.</div><div><br></div>When template parameter C is deduced from the call handler(safeCallback), the default argument `= "hunter2" should be stripped from the deduced function pointer type.<div>
<br></div><div>Then, the call <span style="font-family:arial,sans-serif;font-size:14px">callback("John"); in handler</span><span style="font-family:arial,sans-serif;font-size:14px"> </span><span style="font-family:arial,sans-serif;font-size:14px">template </span><span style="font-family:arial,sans-serif;font-size:14px">function</span><span style="font-family:arial,sans-serif;font-size:14px"> </span><span style="font-family:arial,sans-serif;font-size:14px">body should fail to compile always, because void function(string, string) is not callable using one string argument.</span></div>
<div><span style="font-family:arial,sans-serif;font-size:14px"><br></span></div><div><span style="font-family:arial,sans-serif;font-size:14px">Kenji Hara</span></div><div><div class="gmail_extra"><br><div class="gmail_quote">
2014-04-29 19:38 GMT+09:00 Andrej Mitrovic via Digitalmars-d <span dir="ltr"><<a href="mailto:digitalmars-d@puremagic.com" target="_blank">digitalmars-d@puremagic.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
-----<br>
import std.traits;<br>
import std.stdio;<br>
<br>
void handler(C)(C callback)<br>
{<br>
    callback("John");<br>
}<br>
<br>
void main()<br>
{<br>
    auto safeCallback = (string user, string pass = "hunter2")<br>
    {<br>
        writefln("The password is: '%s'", pass);<br>
    };<br>
<br>
    handler(safeCallback);<br>
    someOtherFunc();<br>
}<br>
<br>
void someOtherFunc()<br>
{<br>
    auto hijackPassword = (string user, string pass)<br>
    {<br>
        writefln("Now I know your password: '%s'", pass);<br>
    };<br>
<br>
    handler(hijackPassword);<br>
}<br>
-----<br>
</blockquote></div><br></div></div></div>