c++ - 当包含对象包含 unique_ptr 时如何删除 vector 的元素?

标签 c++ vector visual-studio-2013 unique-ptr

我注意到当包含类型包含 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/

相关文章:

c++ - 具有多个属性表的 Visual Studio 2013 项目

c++ - 在 C++ 中截断十进制值

c++ - 如何使用静态库构建 Qt5 应用程序?

r - 高于给定阈值的向量值的快速求和

c++ - 从指针 vector 中删除内容

C++ 参数是指向常量对象的指针,但未返回更新的对象?

installation - 要安装的 Visual Studio 2013 可选功能

vb.net - Visual Studio 数组或列表框数据到 Excel 范围

c++ - Sleep() 没有给出准确的时间表示

C++ 相当于 Python difference_update?