Как выразить константу ссылки пересылки?

Пожалуйста, рассмотрите следующий интерфейс функции шаблона с аргументом ссылки пересылки:

template<typename T>
void f(T&& t) { ... }

В этом случае f либо берет ссылку lvalue, либо ссылку rvalue в зависимости от типа аргумента для f. Как я могу выразить, что f не изменяет свой параметр? Следующий наивный подход не работает, поскольку он больше не позволяет передавать ссылки lvalue на f:

template<typename T>
void f(const T&& t) { ... }

Ответ 1

Как я могу выразить, что f не изменяет его параметр?

Если функция не изменяет свой параметр, нет никакой пользы от использования ссылки пересылки. Вы используете ссылку пересылки, когда хотите переслать параметр на какую-то другую функцию, которая волнует, является ли аргумент значением lvalue или rvalue (потому что, возможно, существуют отдельные перегрузки для lvalues ​​и rvalues, а значение rvalue может быть более эффективным).

Если ваша функция не изменяет аргумент, тогда не нужно заботиться о том, имеет ли значение lvalue или rvalue, поэтому он может просто принять const T& безоговорочно. Это может связываться с lvalues ​​и rvalues, а promises - не изменять параметр.

template<typename T>
void f(const T& t) { ... }