That is not how std::forward is intended to be used: std::forward is
expected to be given a deduced type as its template parameter. The
expression 'std::forward<std::string>(s)' would just convert the lvalue
's' to a rvalue - in other words, it would be identical in effect to
'std::move(s)', which is a shorter and more comprehensible way of
writing it, if that is what is actually intended.
With respect to the OP's question about whether binding a temporary to a
function argument comprising a value std::string parameter will prompt
copy elision similar to RVO, the answer is no. Copy elision of objects
with non-trivial copy constructors and/or non-trivial destructors is not
permitted in that case. RVO only applies to function return values.
Chris