Because you do:
template<typename _T>
void f(_T&& v) { i.f(std::forward<T>(v)); }
^
T, not _T
You always use T, not a deduced type v. For clarity, you really do:
template <typename _T>
void f(_T&& v) {
i.f(std::forward<std::string>(v));
}
And the type std::forward<std::string>(v)is equal string&&.
For your second question:
template<typename _T>
void f(_T v) { i.f(std::forward<T>(v)); }
_T , std::forward<T>(v) std::move(v) - rvalue.