If x2 was passed as X&& to someFunction the state of x2 might change (because it has been moved from) so when you pass it to the second function (move_from) it is not receiving the same state as the object had when the move constructor began.
An object is only passed as a rvalue-reference implicitly when you pass a temporary object because it is known that the object can't be used afterwards.
1 2 3
// here the object created by X() is passed as a X&& because
// there is no way the object could be used after this line of code.
someFunction(X());
In all other cases you need to explicitly convert it to a rvalue-reference if that is what you want.
Im completing an example from book and there move constructor and copy constructor is implemented using copy_from and move_from coz they might be useful doing other stuff as well.
Tnx you both guys very much!!! I think I understand now :)
A named rvalue reference behaves just like a reference semantically. If it helps, you should consider it necessary to use std::move to get move semantics whenever the variable is named (except in the case of returning a local variable from a function, where the compiler can deduce the need unambiguously.)
Tnx to you too man! Really appreciate all the answers!
EDIT : and now when I look in the book move_from didnt really take rvalue reference as parameter but just lvalue reference!