В C++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 ответственность снаружи.
В чем причина того, что стандарт рассматривает их по-разному?