What you got in mymove
is universal reference - not rvalue.
The rule of reference collapsing is this :
T&& -> T&&
T&& & -> T&
T& && -> T&
T&& && -> T&&
If you pass a lvalue to mymove
, you are going to get lvalues both as argument and return type. That is why your mymove
is not working in the same way as std::move
works.