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

heL*_*maN 5 c++ copy-constructor

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

struct Res {
    ....
    Res(const Res& rhs) = delete;
    Res& operator=(const Res&) = delete;
    Res(Res&&) = delete;
    Res& operator=(Res&&) = delete;
};
Run Code Online (Sandbox Code Playgroud)

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

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

Sha*_*ger 2

由于您已经删除了复制和移动构造函数/赋值运算符,因此答案是:您无法以任何合理的方式使用这样的vector。如果没有复制或移动作为选项,您最多只能预先预留一次reserve空间并进入,但任何可能随后改变容量或以任何方式重新排列元素的行为都是非法的(因为它会隐含地涉及使用移动或复制操作)。emplace_backvector

正如评论中提到的,您可以创建一个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_;
}
Run Code Online (Sandbox Code Playgroud)

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