Во-первых, мы можем отделить объявление от определения. Так что имя в декларации не очень полезно. и имя может использоваться в определении
template <int> struct Foo;
template <unsigned long = 42> struct Bar;
template <int N> struct Foo {/*..*/};
template <unsigned long N> struct Bar {/*..*/};
Специализация - это особый случай определения.
Тогда имя можно не использовать, поэтому мы можем его опустить:
template <std::size_t, typename T>
using always_t = T;
template <std::size_t ... Is, typename T>
struct MyArray<std::index_sequence<Is...>, T>
{
MyArray(always_t<Is, const T&>... v) : /*..*/
};
или используется для SFINAE
template <typename T, std::size_t = T::size()>
struct some_sized_type;