The whole premise about forwarding references (aka universal references) is, that this function:
template<typename T>
void f(T&&) { }
can result in the template parameter either being int& or int, depending if you call it with int a{}; f(a) or f(5) as example. But this is already a step too far I think. Because when I have a function like
template<typename T>
auto g(T) -> void {}
Then it always resolves the template parameter to int, regardless of the way I call it. And that although a auto h(int&) -> void {} is perfectly legal.
So what what rules are in place that allow the template parameter of f to be a reference, but not that of g?