Ответ 1
Как я могу выразить, что f не изменяет его параметр?
Если функция не изменяет свой параметр, нет никакой пользы от использования ссылки пересылки. Вы используете ссылку пересылки, когда хотите переслать параметр на какую-то другую функцию, которая волнует, является ли аргумент значением lvalue или rvalue (потому что, возможно, существуют отдельные перегрузки для lvalues и rvalues, а значение rvalue может быть более эффективным).
Если ваша функция не изменяет аргумент, тогда не нужно заботиться о том, имеет ли значение lvalue или rvalue, поэтому он может просто принять const T&
безоговорочно. Это может связываться с lvalues и rvalues, а promises - не изменять параметр.
template<typename T>
void f(const T& t) { ... }