std::decay returns the type of a parameter, as if that parameter was passed by value.

Interesting interpretation. I always intended std::decay as a way to deduce the type resulting from array to pointer decay. But this is indeed limiting, as stated by cppreference:

This is the type conversion applied to all function arguments when passed by value.

See here