首页 > 解决方案 > 为什么这个结构的移动赋值运算符被删除了?

问题描述

当我创建此结构的数组并尝试擦除前 2 个成员时,它会生成编译器错误(Visual Studio 2019):

struct A {
    virtual void unimplemented() = 0;
};
enum B {
    a, b, c, d, e, f
};
struct AorB {
    const bool isA;
    union {
        A* a;
        B b;
    };
    AorB(A* aVal) :a(aVal), isA(true) {};
    AorB(B bVal) :b(bVal), isA(false) {};
};
int main() {
    std::vector<AorB> vec{ a,b,c };
    vec.erase(vec.begin(), vec.begin() + 1);
}

错误:

Error C2280 'AorB &AorB::operator =(const AorB &)': attempting to reference a deleted function  
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\include\xutility    3907    

我认为当向量重新排列它的元素时会调用移动赋值运算符,但我不明白为什么它被删除。我删除了联合,但它仍然产生了这个错误。

标签: c++

解决方案


删除 const 限定符并将其更改为bool isA;. isA如果您本质上希望它作为常量,则不能在结构内部进行修改。


推荐阅读