Продвижение <t> так же, как вперед <T&&> ?

Рассматривая документацию для std::forward,

template< class T >
constexpr T&& forward( typename std::remove_reference<T>::type& t ) noexcept;
template< class T >
constexpr T&& forward( typename std::remove_reference<T>::type&& t ) noexcept;

Обе функции возвращают T&&, которые (поправьте меня, если я ошибаюсь) обрушиваются на

  • T& если T является ссылкой на lvalue
  • T&& если T является ссылкой rvalue, или если T не является ссылкой

Для произвольного типа T который может быть ссылкой, действительно ли обращение коллапса всегда приводит к тому, что forward<T> выполняет то же самое, что и forward<T&&>?

Если да, то есть ли какая-либо причина использовать forward<T&&>?

Ответ 1

Свертывание ссылок всегда приводит к тому, что forward<T> выполняет то же самое, что и forward<T&&>?

Да.

[Я] Есть ли какая-нибудь причина использовать forward<T&&>?

Нет.

Заметим, что это предполагает, что только forward с точки зрения являются два перегруженных вы показали в std::.