Ответ 1
с вашим дизайном:
void doWork(Widget && param)
{
Widget store1 = param; // automatically move param
Widget store2 = param; // boom
Widget store_last = param; // boom
}
с текущим дизайном:
void doWork(Widget && param)
{
Widget store1 = param; // ok, copy
Widget store2 = param; // ok, copy
Widget store_last = std::move(param); // ok, param is moved at its last use
}
Итак, мораль здесь заключается в том, что даже если у вас есть ссылка rvalue, у вас есть имя для нее, что означает, что вы можете использовать ее несколько раз. Таким образом, вы не можете автоматически переместить его, потому что он может понадобиться для последующего использования.