如何在std :: vector中存储没有复制构造函数的类?

时间:2018-11-24 03:04:46

标签: c++ copy-constructor

在我们的项目代码中,不应复制资源类型。

struct Res {
    ....
    Res(const Res& rhs) = delete;
    Res& operator=(const Res&) = delete;
    Res(Res&&) = delete;
    Res& operator=(Res&&) = delete;
};

但是,似乎std容器都需要复制构造函数。那么如何将Res存储在std :: vector中?

class ResourceCache{
    ....
    const Res& GetRes(size_t index);
    std::vector<Res> resources_;
}

1 个答案:

答案 0 :(得分:1)

由于您已经删除了复制和移动构造函数/赋值运算符,因此答案是:您无法以任何合理的方式使用此类vector。如果不选择复制或移动,则最多只能将reserve空格一次emplace_back预先放入vector,但是随后可能更改容量或以任何方式重新排列元素都是非法的(因为这将隐式涉及使用移动或复制操作)。

但是如评论中所述,您可以制作一个vector智能指针,其中仅该智能指针必须被移动/复制,而不是它指向的Res实例,并获得一个完整的指针。功能vector。例如,使用std::unique_ptr,您的类可以实现为:

class ResourceCache{
    ....
    const Res& GetRes(size_t index) {
        return *resources_.at(index);  // Can still provide const references at API level
    }
    std::vector<std::unique_ptr<Res>> resources_;
}

,您只需使用resources_.push_back(std::make_unique<Res>(...args to Res constructor...))即可将元素创建/插入resources_中,而不是resources_.push_back(Res(...args to Res constructor...))