On Tuesday, 17 September 2013 at 11:24:10 UTC, Luís Marques wrote:
Could you please comment on the following behaviors? Are all of them intended? Are they internally coherent, with respect to each
 other?

Looks fine to me.

1)
    void foo(alias f)(int f)
    {
        writeln(f);
    }

    foo(42);

    Error: does not match template

`alias` is never inferred so error is expected. You did not provide any template parameters to foo. `void foo(T)(T f)` would have worked because `T` can be inferred.

2)
    ...
    foo!(42)(42);

    > 42

Explicit template parameter + normal parameter. Name of normal parameter shadows alias name (would have expected a warning/error here tbh).

3)
    ...
    foo!(7)(42);

    > 42

Same as (2).

4)
    void foo(alias f)(int g=f)
    {
        writeln(g);
    }

    foo(42);

    Error: does not match template

Again, you do not provide template parameter, it can't match. `foo!(42)()` should have worked here.

5)
    void foo(alias f=42)(int g=f)
    {
        writeln(g);
    }

    foo();

    > 42

Default parameters can be used everywhere so no need to provide any parameter explicitly.

Reply via email to