代码之家  ›  专栏  ›  技术社区  ›  Searene

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

c++
  •  19
  • Searene  · 技术社区  · 7 年前

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

    #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 ,这意味着 作品为什么?为什么不呢 移动

    1 回复  |  直到 7 年前
        1
  •  39
  •   Vittorio Romeo    7 年前

    指定类的析构函数将禁止自动生成移动构造函数和移动赋值。您可以使用 = 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;
    };
    

    霍华德·希南特为他的朋友们创造了一张极好的桌子 演示:

    enter image description here