X is any type, then
X&& is called an rvalue reference to
For better distinction, the ordinary reference
X& is now also called an lvalue reference.
An rvalue reference is a type that behaves much like the ordinary reference
X&, with several exceptions.
The most important one is that when it comes to function overload resolution, lvalues prefer old-style lvalue references,
whereas rvalues prefer the new rvalue references:
void foo(X& x); // lvalue reference overload
void foo(X&& x); // rvalue reference overload
foo(x); // argument is lvalue: calls foo(X&)
foo(foobar()); // argument is rvalue: calls foo(X&&)
So the gist of it is: