Я пытался переместить экземпляр на другой, как показано ниже:
#include <iostream>
class student {
public:
student() = default;
student(const student& student) {
std::cout << "copy student" << std::endl;
}
student(student&& student) {
std::cout << "move student" << std::endl;
}
virtual ~student() = default;
};
class undergraduate: public student {
public:
undergraduate(): student() {}
~undergraduate() override = default; // removing this line will make std::move work
};
int main() {
undergraduate student;
undergraduate student1 = std::move(student);
}
Вот вывод:
copy student
Как вы можете видеть, std::move
не работал, student
был скопирован вместо перемещения, однако, если я удалю деструктор undergraduate
, то есть следующую строку:
~undergraduate() override = default; // removing this line will make std::move work
Выходными данными станет move student
, что означает, что работает std::move
. Зачем? Почему std::move
работает, когда указан деструктор производного класса?