In order to understand type deduction from a call to a function such as
template <typename T> void f(T &p);
in which the function’s parameter
p is a reference to a template type parameter
T, it is important to keep in mind two points: Normal reference binding rules apply; and
consts are low level, not top level.
When a function parameter is an ordinary (lvalue) reference to a template type parameter (i.e., that has the form
T&), the binding rules say that we can pass only an lvalue (e.g., a variable or an expression that returns a reference ...