Mixin template parameter overloading bug?

Nick Treleaven nick at geany.org
Sun Jun 15 10:51:37 UTC 2025


On Saturday, 14 June 2025 at 23:49:19 UTC, Steven Schveighoffer 
wrote:
> A lambda is a shortened syntax for a function literal or 
> delegate literal.
>
> HOWEVER, when you do not give the parameters types, the lambda 
> becomes a template! Well, not actually a template, but a 
> quasi-template.

An untyped parameter does make the literal an actual template:
```d
pragma(msg, __traits(isTemplate, (x) {})); // true
```
It can be instantiated with a type parameter.

https://dlang.org/spec/expression.html#function-literal-alias

> If you add types to your lambda, then the compiler can figure 
> it out:
>
> ```d
> mixin f!((S _) {});
> mixin f!((S _) => 0);
> ```
>
> These are now no longer templates, but instead concrete 
> function literals.

When there are no parameters, a literal is not a template:
```d
pragma(msg, __traits(isTemplate, () {})); // false

alias f = () {};
pragma(msg, is(typeof(*f) == function)); // true
```

So I think there must be another reason why your unary literals 
work.


More information about the Digitalmars-d-learn mailing list