我有一个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元素实现移动构造函数时,是否有任何解决方法可以实现擦除?任何帮助表示赞赏。
答案 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
。