Why does the
<size_t ...Idxs>
construct work, when we needed same_as<char>? <size_t ...Idxs>
construct work, when we needed same_as<char>?<size_t ...Idxs> works because it introduces a pack that is a template parameter, so it naturally gets templated on the size of the pack (as well as on the values).
I guess an other historical issue for the grammar is that without the parameter name, `void foo(size_t ...)` is already valid grammar, and is equivalent to `void foo(size_t, ...)`, a C-style variadic.