moveについての質問.

struct Hoge
{
  Hoge&& foo()
  {
    Hoge tmp(*this);
    ...
    return std::move(tmp);
  }
  ...
};

Hoge x;
Hoge y = x.foo();

できるだけコピー減らすためにこんな使い方をすべきなのかと思ったのだけど
これじゃやっぱりyのムーブコンストラクタの前に戻り値は破棄される?
素直に値返しにすべきだろうか

値返しにしたとしても関数の戻り値がrvalueになって
yのムーブコンストラクタを呼ぶっていう認識があっているかも聞きたい