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

时间:2017-01-04 15:58:46

标签: c++ c++11

我有一个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++;
     }
}

编译错误:

  

错误:使用已删除的功能&#39;缓存&amp; Cache :: operator =(const Cache&amp;)&#39;            __ result = std :: move( __ first);                     ^注意:&#39;缓存&amp; Cache :: operator =(const Cache&amp;)&#39;被隐式声明为已删除,因为&#39;缓存&#39;宣布一招   构造函数或移动赋值运算符        struct Cache {

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

2 个答案:

答案 0 :(得分:5)

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

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

因此,您可以保持课程的可移动性和不可复制性,但您需要编写移动分配操作符

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

顺便说一下,你的循环被打破了;如果服务名称​​不匹配

,它不会在容器中前进。

答案 1 :(得分:0)

删除此代码:

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