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