gpt4 book ai didi

c++ - 当指定派生类的析构函数时,std::move 不起作用

转载 作者:IT老高 更新时间:2023-10-28 21:55:02 24 4
gpt4 key购买 nike

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

#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 不起作用?

最佳答案

指定类的析构函数会禁止自动生成移动构造函数和移动赋值。您可以使用 = 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 为他的你想知道的关于移动语义(以及其他一些)的所有内容创建了一个出色的表格:

enter image description here

关于c++ - 当指定派生类的析构函数时,std::move 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53946915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com