This is a very common mistake when people first learn about rvalue links. The main problem is the confusion between type and category of values .
int is a type. int& is a different type. int&& is another type. These are all different types.
lvalues and rvalues are things called value categories. Please check out the fantastic diagram here: What are rvalues, lvalues, xvalues, glvalues and prvalues? . You can see that in addition to lvalues and rvalues, we also have prvalues and glvalues and xvalues, and they form different relationships such as venn.
C ++ has rules that say that variables of various types can be associated with expressions. However, the reference type of expressions is discarded (people often say that expressions do not have a reference type). Instead, the expression has a category of values that determines which variables can bind to it.
Set the other way: rvalue links and lvalue links are directly related only to the left side of the assignment, and the variable is created / bound. On the right side, we are talking about expressions, not variables, and the reference value rvalue / lvalue only matters in the context of defining a category of values.
A very simple example to start with is a simple look at things of pure int type. An int variable is an lvalue as an expression. However, the expression consisting in evaluating the function returning int is the value of r. This makes most people intuitive; the key point is the separation of the type of expression (even before dropping links) and its category of values.
The fact that even if variables of type int&& can only bind to rvalues does not mean that all expressions of type int&& are equal to rvalues. In fact, since the rules at http://en.cppreference.com/w/cpp/language/value_category say that any expression consisting of a variable name is always an lval value regardless of type.
This is why you need std::move to pass rvalue links to subsequent functions that take an rvalue link. This is because rvalue links are not tied to other rvalue links. They are attached to rvalues. If you want to get a move constructor, you need to give it an rvalue for the binding, and the link named rvalue is not the value of r.
std::move is a function that returns an rvalue reference. And what is the value category of such an expression? Rvalue? Nope. This is the value of x. This is basically an rvalue, with some additional properties.