あと,実際には>>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 に渡される. }