Если у вас есть производный объект с конструктором перемещения, а базовый объект также имеет семантику перемещения, как правильно вызвать конструктор перемещения базового объекта из конструктора перемещения производного объекта?
Сначала я попробовал самое очевидное:
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
?