我注意到当包含类型包含 unique_ptr 时,无法删除 vector 的元素。
例如这个类:
class Bar
{
std::unique_ptr<int> pointerTest;
Bar(Bar &bar) {};
public:
Bar() { pointerTest = std::unique_ptr<int>(new int); }
Bar(Bar &&bar) { this->pointerTest = move(bar.pointerTest); }
void testFunc() { pointerTest.release(); }
};
这不适用于这种用法:
int main()
{
vector<Bar> test123;
Bar foo;
test123.push_back(move(foo));
test123.erase(test123.begin());
}
//Error 1 error C2280: 'std::unique_ptr<int,std::default_delete<_Ty>> &std::unique_ptr<_Ty,std::default_delete<_Ty>>::operator =(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 611 1 testing
当您只调用对象方法而不是删除时,代码将起作用:
for (auto &item : test123)
item.testFunc();
为什么我不能在 vector 上使用删除,我该如何解决这个问题?
最佳答案
问题是您的类(class)没有正确遵循三/五规则。您定义了复制和移动构造函数,但没有定义移动赋值运算符。这意味着不会生成移动赋值运算符,并且在赋值时始终使用默认的复制赋值运算符。但是,由于您的类有一个不可复制的成员,默认的复制赋值运算符被定义为已删除,因此您在使用它时会出错。
它被调用是因为从 vector 中删除元素会导致 vector 的所有后续元素发生移位(即赋值)。这通常是一个移动分配,但由于在您的类(class)中没有定义(也不是自动生成),复制分配被调用 - 并且失败。
我看到您正在使用 Visual Studio,因此无论如何都不会自动生成移动构造函数/移动赋值运算符(VS 尚不支持这部分标准)。因此,要以 VS 兼容的方式解决此问题,请定义一个移动赋值运算符。并且在您使用它时删除复制构造函数可能是个好主意 - 该类看起来像是不可复制类的主要示例。
关于c++ - 当包含对象包含 unique_ptr 时如何删除 vector 的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20148558/