以下是我遇到问题的类的缩小实现:
class Dummy{
public:
Dummy();
~Dummy();
void addItem(std::unique_ptr<Type>&& item);
private:
QVector<std::unique_ptr<Type>> collection;
}
上面的代码片段中的Type
是另一个支持移动语义的类。
这是addItem
成员的实现:
void Dummy::addItem(std::unique_ptr<Type>&& item){
if((std::find(collection.begin(), collection.end(), item) == colection.end()){
collection.push_back(std::move(item));
}
}
我使用类Dummy
如下:
Dummy myDummy;
std::unique_ptr<Type> item(new Type());
myDummy.addItem(sdt::move(item));
编译器报告以下内容:
required from 'QVector<T>::iterator QVector<T>::begin()'
required from here
use of deleted function 'std::unique_ptr<_Tp,_Dp>::unique_ptr(const std::unique_ptr<_Tp,_Dp>&)'
这是否意味着我无法在QVector<std::unique_ptr<Type>>
上迭代提供的迭代器,因此无法使用算法标头提供的std::find
?
我可以为for(auto const& other : collection)
使用range-base并为Type
实现相等运算符,以便从std::find
获得行为。
我无法理解该示例在哪里出错。
答案 0 :(得分:1)
问题是QVector
在您执行以下操作时会复制(复制构造)其元素:
push_back()
函数添加它们。要避免第二个,您必须使用相当常量的迭代器,即QVector::constBegin()
和QVector::constEnd()
,即
if (std::find(collection.constBegin(), collection.constEnd(), item) == collection.constEnd()) {...}
为避免在添加时复制... hm,我建议改用std::vector
。