When && is used in association with a type to be deduced, like in the function below:
template<typename T>
void foo(T&& arg)
{
/* … */
}void bar()
{
std::string s;
// calls foo(std::string&)
foo(s);
// calls foo(std::string&&)
foo(s + "abc");
}
Then it refers neither to an rvalue-reference nor a reference. In this context, it is called a universal reference. Depending on how the function is called then T&& will be either deduced to an rvalue-reference, if the argument is an rvalue, or else the references are collapsed and T&& becomes an lvalue-reference, just like T&.
Now how one should pass to another function an argument received as a universal reference? If it is deduced as an rvalue-reference, then std::move() should be used, otherwise it should be passed as is.
<utility>
Fortunately C++11 provides std::forward() to do the check for us:
template<typename T>
void foo(T&& arg)
{
// Pass as an rvalue-reference or by address, whichever fits.
foobar(std::forward<T>(arg));
}