首页 文章

无法使用迭代器擦除向量元素,向量元素实现移动构造函数

提问于
浏览
0

我有一个struct Cache的向量 . 实现Move构造函数的Cache . 每当我尝试迭代这个向量并尝试在特定条件下擦除元素时,它就无法编译 .

struct Cache {
    Cache() {}

    Cache(Cache&& other)
        : serviceName(std::move(other.serviceName))
    {}

    ~Cache() {}

    size_t referenceCount;
    std::string serviceName;
};

std::vector<Cache> vectorCaches;
auto iter = vectorCaches.begin();
while(iter != vectorCaches.end()) {
     if(iter->serviceName == "Sample") {
         iter = vectorCaches.erase(iter); //compiler error here
     } else {
         iter++;
     }
}

编译错误:

错误:使用已删除的函数'Cache&Cache :: operator =(const Cache&)'__ result = std :: move(__ first); ^注意:'Cache&Cache :: operator =(const Cache&)'被隐式声明为已删除,因为'Cache'声明了一个移动构造函数或移动赋值运算符struct Cache {

当vector元素实现移动构造函数时,是否有任何解决方法可以实现擦除?任何帮助表示赞赏 .

2 回答

  • 0

    通过创建移动构造函数而不是复制构造函数,您已使类型不可复制 .

    这很好,但是矢量要求您的元素可以在其存储空间中复制或移动,特别是当您从容器中移除并且必须将所有以下元素拖垮时 . 它通过分配来完成 .

    因此,您可以保持您的类可移动和不可复制,但您确实需要编写 move assignment operator .

    通常:如果您编写复制构造函数,请编写复制赋值运算符;并且,如果您编写移动构造函数,请编写移动赋值运算符 .

    顺便说一句,你的循环被打破了;如果服务名称不匹配,它不会通过容器进行 .

  • 5

    删除此代码:

    Cache(Cache&& other)
        : serviceName(std::move(other.serviceName))
    {}
    

    它没有任何好处 . 它甚至看起来越野车,如果不是马车非常令人惊讶 .

    用 . . . 来代替:

    Cache(Cache&& other)=default;
    Cache(Cache const& other)=default;
    Cache& operator=(Cache&& other)=default;
    Cache& operator=(Cache const& other)=default;
    

    或者,在某些情况下,省略所有4.我喜欢明确默认 .

    编译器错误是因为创建 Cache(Cache&&) 隐式地删除了上面的其他成员函数,特别是 operator=(Cache&&) vector.erase .

相关问题