基类中的默认析构函数,如果有成员,则禁用子类中的move构造函数

问题描述 投票:0回答:1

为什么默认Base1中的默认(用户声明)析构函数防止在Child1类中生成move构造函数/运算符,但是当我将成员data从Base(Base2)移至子级(Child2)类?

struct Data {
    Data() {}
    Data(Data&&) noexcept { cout << "Move constructor" << endl; }
    Data& operator=(Data&&) noexcept {
        cout << "Move assign" << endl;
        return *this;
    }
    vector<int> vec;
};

struct Base1 {
    virtual void fun() { cout << "Base1::fun" << endl; }
    virtual ~Base1() = default;
    Data data;
};

struct Child1 : public Base1 {
    void fun() override { cout << "Child1::fun" << endl; }
};

struct Base2 {
    virtual void fun() { cout << "Base2::fun" << endl; }
    virtual ~Base2() = default;
};

struct Child2 : public Base2 {
    void fun() override { cout << "Child2::fun" << endl; }
    Data data;
};

int main() {
    Child1 c1;
    auto obj1 = std::move(c1);  // error

    Child2 c2;
    auto obj2 = std::move(c2);
}

我目前的理解是,当我在Base(default)中将析构函数声明为“ BaseDel”时,在Base(deleted)和Child(BaseDel)中,move构造函数应为“ ChildDel”类。它是否正确?我认为,会员位置无关紧要。如果我明确地执行此操作,则会收到预期的错误:

struct BaseDel {
    BaseDel() {}
    virtual void fun() { cout << "BaseDel::fun" << endl; }
    BaseDel(BaseDel&& st) = delete;
    virtual ~BaseDel() = default;
};

struct ChildDel : public BaseDel {
    ChildDel() {}
    void fun() override { cout << "ChildDel::fun" << endl; }
    Data data;
};

int main() {
    ChildDel cd;
    auto objd = std::move(cd);  // OK, expected error
}
c++ c++11 move-semantics virtual-destructor
1个回答
0
投票
declared
© www.soinside.com 2019 - 2024. All rights reserved.