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