Looking at the definition of std::forward, I do not understand why it is necessary to specify a remove_reference_t in the first and only argument, like so:
1 2 3 4 5
template <class _Ty>
constexpr _Ty&& forward(
remove_reference_t<_Ty>& _Arg) noexcept { // forward an lvalue as either an lvalue or an rvalue
returnstatic_cast<_Ty&&>(_Arg);
}
because _Ty could be a for some type C, equal to C& or C&& and by the collapsing rules both would return a C&, which is the same as applying remove_reference_t.