右辺値参照について教えて下さい。
VC2010 で、
struct Hoge {
    Hoge(Hoge&& rhs) {
        *this = rhs; // 1
    }

    Hoge& operator=(const Hoge& rhs); // 2
    Hoge& operator=(Hoge&& rhs); //3
}

1 の箇所で、3 が呼ばれるかと思ったら、2 が呼ばれてしまいました。
これは、規格通りの動作なのでしょうか?
もしそうなら、右辺値参照の operator= にもっていくには、
コンストラクタの引数に対して std::move() すればいいのだと思うのですが、
どうして引数の型が && なのに、再度 std::move しなければいけないのか
理由を知っていれば教えて下さい。