I don't have a source, but I have read that the reason this wasn't originally introduced into C++ was because they couldn't agree on what the syntax would be. So much pain because the committee is dysfunctional, it took a decade plus to introduce something that everyone from the start wanted and understood would improve things. Par for the course with C++.
I usually find myself putting parameter packs into tuples and then using `std::get` on the tuple to index. It's not perfect (will end up making copies), but has the side benefit of being able to additionally store the parameter pack for later.
The griping in the comments here is insane considering that being able to easily static_assert(first(1, 2, 3, 4, 5) == 1) is a pretty powerful language feature.
Zig's approach to generics and metaprogramming - treating functions and types as first-class compile-time values in the base language - makes more and more sense.
More insane... syntax from the C++ committee. How about a readable function-like keyword, like any other self-respecting language? C++ surpassed APL and Perl by far already. Really, in APL there is some consistency at least.