あと,実際には>>141さんが指摘しているように
名前が付いた右辺値参照は左辺値として扱われるので,
右辺値として渡された f の引数を f の内部で引き続き右辺値として扱うには
明示的に右辺値参照に変換してやらないといけないです.
で,このために std::forward という補助的な関数テンプレートも提案されています.

template<typename T>
T &&forward(typename identity<T>::type &&x){return x;}

template<typename T>
void f(T &&x)
{
  g(forward<T>(x)); // f が右辺値で呼ばれている場合, T が非参照型になっているので
                         // forward の戻り値型が右辺値参照型になり,右辺値として g に渡される.
                         // f が左辺値で呼ばれている場合, T が参照型になっているので
                         // forward の戻り値型が左辺値参照型になり,左辺値として g に渡される.
}