Да, нарезка происходит, потому что оператор присваивания перемещения выбран статически (во время компиляции), а статический тип левой стороны равен Parent&
, а не Child
:
Child c;
Child c2;
Parent& p_ref = c2;
p_ref = std::move(c); // (1)
Для пояснениявы не «переходите в lvalue-ссылку».Вы перемещаетесь в объект , но не используете функцию, которая перемещает весь объект (Child::operator=
), а ту, которая перемещает только часть Parent
(Parent::operator=
).
В частности, нет ничего особенного в семантике перемещения;такое же поведение будет применяться к любой функции-члену.Тип правостороннего оператора в этом случае не имеет значения.
class Parent
{
public:
virtual ~Parent() = default;
void func(); // non-virtual, like move assignment
};
class Child : public Parent
{
public:
void func();
};
// usage:
Child c;
Parent& p_ref = c;
p_ref.func(); // calls Parent::func(), not Child::func()