我试图将一个实例移动到另一个实例,如下所示:
#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
不起作用? 最佳答案
指定类的析构函数会禁止自动生成move构造函数和move赋值。您可以使用= default
还原它们:
class undergraduate: public student {
public:
undergraduate(): student() {}
~undergraduate() override = default;
undergraduate(const undergraduate&) = default;
undergraduate& operator=(const undergraduate&) = default;
undergraduate(undergraduate&&) = default;
undergraduate& operator=(undergraduate&&) = default;
};
霍华德·辛南特(Howard Hinnant)为他所想了解的关于移动语义学(以及其他一些东西)的创作制作了一张出色的桌子。”