This compiles in GCC 4.8 but fails in GCC 4.9, which is evidence that it's related to CWG 1430 and bug report #59498. The fix proposed by Roy Chrihfield is the exact same one as yours:
Originally, a pack expansion could not expand into a fixed-length
template parameter list, but this was changed in N2555. This works
fine for most templates, but causes issues with alias templates.
In most cases, an alias template is transparent; when it's used in a
template we can just substitute in the dependent template arguments.
But this doesn't work if the template-id uses a pack expansion for
non-variadic parameters. For example:
template<class T, class U, class V>
struct S {};
template<class T, class V>
using A = S<T, int, V>;
template<class... Ts>
void foo(A<Ts...>);
There is no way to express A<Ts...> in terms of S, so we need to hold
onto the A until we have the Ts to substitute in, and therefore it
needs to be handled in mangling.
Currently, EDG and Clang reject this testcase, complaining about too
few template arguments for A. G++ did as well, but I thought that was
a bug. However, on the ABI list John Spicer argued that it should be
rejected.
(See also issue 1558.)
Notes from the October, 2012 meeting:
The consensus of CWG was that this usage should be prohibited,
disallowing use of an alias template when a dependent argument can't
simply be substituted directly into the type-id.
Additional note, April, 2013:
For another example, consider:
template<class... x> class list{};
template<class a, class... b> using tail=list<b...>;
template <class...T> void f(tail<T...>);
int main() {
f<int,int>({});
}
There is implementation variance in the handling of this example.
In otherwords, this is an on-going issue without any resolution (AFAIC) in sight.