【发布时间】:2017-05-18 23:57:25
【问题描述】:
我有一个 struct Cache 的向量。实现 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' 声明了移动 构造函数或移动赋值运算符 结构缓存 {
当矢量元素实现移动构造函数时,是否有任何解决方法来实现擦除?任何帮助表示赞赏。
【问题讨论】:
-
尝试让你的移动构造函数
noexcept。 -
@KerrekSB OP不需要定义移动赋值运算符吗?
-
@NathanOliver:确实如此。
-
@FelixLauer:
break可能不合适。线索:OP 已经竭尽全力让iter对下一次迭代有效,并且容器是一个向量,可能包含重复项。 -
另外请注意,在这种情况下,您不需要定义任何构造函数,如果需要,您不需要定义任何构造函数来填充缓存成员。所有其他特殊成员函数将由编译器生成。