Consider the following code:
template
struct S;
template
struct S { };
template
From [dcl.fct], emphasis mine:
A parameter list consisting of a single unnamed parameter of non-dependent type
voidis equivalent to an empty parameter list. Except for this special case, a parameter shall not have type cvvoid.
In this case, Args... is a dependent type pack, so void is not allowed there. This idea is repeated in a note in [temp.deduct]:
[ Note: Type deduction may fail for the following reasons:
— [...]
— Attempting to create a function type in which a parameter has a type ofvoid, or in which the return type is a function type or array type.
— [...]
—end note ]
Note that S<void(void)> compiles since void(void) is non-dependent and is equivalent to void(), so Ret(Args...) is never deduced to have void in the parameter list - it's deduced with Args... empty.
At least there's a simple workaround in that you can just write Alias<>.