> What does this generate?
>
> auto foo(auto ref S a, auto ref S b, auto ref S c, auto ref S 
> d) { ... }
>
> 16 different functions, one for each combination? Sounds like a 
> bad idea.
In my opinion, this should produce only two functions:
#1: auto foo(ref S a, ref S b, ref S c, ref S d) { ... }
#2: auto foo(S a, S b, S c, S d) { ... }