我试图将一个实例移动到另一个实例,如下所示:

#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)为他所想了解的关于移动语义学(以及其他一些东西)的创作制作了一张出色的桌子。”

c&#43;&#43; - 指定派生类的析构函数时,std::move不起作用-LMLPHP

09-09 23:25
查看更多