The C++ standard states that variardic parameter packs must be last (as packs for template classes; for functions, different rules exist).
So in your second case, you don't have a variardic parameter pack. So it is allowed.
If you want to know why the C++ standard states that variardic parameter packs must be last, mostly it is because nobody has given a convincing argument why it should be changed.
By having variardic packs last, the matching rules are going to be simpler (the variardic pack matches everything) and clear. Once you add "oh and you can add defaults" or whatever, wording gets trickier, and what the best choice is gets more confusing.
template<class... Ts, class Tail>
struct foo {};
should foo<int, double>
pass double
to Tail
? Or should it fail? You could spill oceans of ink talking about this.
And what about template specialization? I shudder.
Using this for enable_if
stuff is not going to be a strong sell, as concepts are here and solve most if not all enable_if
clause issues.