This is a compiler bug.

When template parameter C is deduced from the call handler(safeCallback),
the default argument `= "hunter2" should be stripped from the deduced
function pointer type.

Then, the call callback("John"); in handler template function body should
fail to compile always, because void function(string, string) is not
callable using one string argument.

Kenji Hara

2014-04-29 19:38 GMT+09:00 Andrej Mitrovic via Digitalmars-d <
digitalmars-d@puremagic.com>:

> -----
> import std.traits;
> import std.stdio;
>
> void handler(C)(C callback)
> {
>     callback("John");
> }
>
> void main()
> {
>     auto safeCallback = (string user, string pass = "hunter2")
>     {
>         writefln("The password is: '%s'", pass);
>     };
>
>     handler(safeCallback);
>     someOtherFunc();
> }
>
> void someOtherFunc()
> {
>     auto hijackPassword = (string user, string pass)
>     {
>         writefln("Now I know your password: '%s'", pass);
>     };
>
>     handler(hijackPassword);
> }
> -----
>

Reply via email to