Конструктор перемещения на производном объекте

Если у вас есть производный объект с конструктором перемещения, а базовый объект также имеет семантику перемещения, как правильно вызвать конструктор перемещения базового объекта из конструктора перемещения производного объекта?

Сначала я попробовал самое очевидное:

 Derived(Derived&& rval) : Base(rval)
 { }

Однако, похоже, это привело к вызову конструктора копирования базового объекта . Затем я попытался явно использовать здесь std :: move , вот так:

 Derived(Derived&& rval) : Base(std::move(rval))
 { }

Это сработало, но я не понимаю, зачем это нужно. Я думал std :: move просто возвращает ссылку на rvalue. Но поскольку в этом примере rval уже является ссылкой на значение rvalue, вызов std :: move должен быть излишним. Но если я не использую здесь std :: move , он просто вызывает конструктор копирования. Так почему же необходим вызов std :: move ?

45
задан bitek 15 March 2013 в 13:22
поделиться