В С++ 11 значения параметров (и других значений) имеют неявный ход при возврате:
A func(A a) {
return a; // uses A::A(A&&) if it exists
}
Как минимум в MSVC 2010, для ссылочных параметров rvalue требуется std::move
:
A func(A && a) {
return a; // uses A::A(A const&) even if A::A(A&&) exists
}
Я бы предположил, что внутри функций, ссылка на rvalue и значение ведут себя одинаково, с той лишь разницей, что в случае значений сама функция несет ответственность за разрушение, тогда как для ссылок rvalue ответственность за пределами.
Какова мотивация для их обработки по-разному в стандарте?