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

Not able to erase vector element using iterator, vector element implements the move constructor

本文关键字:元素 实现 移动 构造函数 迭代器 擦除      更新时间:2023-10-16

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

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"声明了一个移动 构造函数或移动赋值运算符 结构缓存 {

当矢量元素实现移动构造函数时,是否有任何解决方法可以实现擦除?任何帮助,不胜感激。

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

这很好,但是向量要求可以在其存储空间中复制或移动元素,特别是当您从容器中删除并且必须将以下所有元素打乱时。它通过分配来执行此操作。

因此,您可以保持类可移动和不可复制,但确实需要编写移动赋值运算符

通常:如果编写复制构造函数,请编写复制赋值运算符

;如果编写移动构造函数,请编写移动赋值运算符。

顺便说一下,你的循环被破坏了;如果服务名称不匹配,它不会通过容器。

删除此代码:

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&&)隐式删除了上面的其他成员函数,特别是vector.erase使用的operator=(Cache&&)

相关文章: