c++ - 如何将 const weak_ptr 放入 STL 容器中

标签 c++ stl c++11 smart-pointers

我有一个 TileManager 类来管理对象的生命周期,因此对它们持有一个 shared_ptr:

class TileManager {
private:
    std::vector<std::shared_ptr<const Tile>> tiles;
}

现在我有另一个 Map 类,它包含对 TileManager 管理的对象的非拥有引用:

class Map {
private:
    std::vector<std::weak_ptr<const Tile>> tiles;
}

我的问题是:我不希望 Map 类能够操纵指向 Tile 的智能指针。因此,我想使 vector 内部的指针为常量:

class Map {
private:
    std::vector<const std::weak_ptr<const Tile>> tiles;
}

遗憾的是,无法将 const 对象放入 STL 容器中。

有人知道解决办法吗?也许是完全不同的设计?

最佳答案

存储在vector 中的元素不能是const,因为它们必须是可赋值的。 vector 可以以任何可观察的方式“操纵”指针的唯一方法是销毁给定对象的最后一个 weak_ptr,这将导致相应对象的控制 block shared_ptr 将被释放(假设没有其他 shared_ptr 仍然引用它)。

简而言之,您可以安全地将非const weak_ptr 存储在 vector 中。

关于c++ - 如何将 const weak_ptr 放入 STL 容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13100300/

相关文章:

c++ - 从参数包中提取成员类型

c++ - 您可以强制从静态库链接未引用的代码吗?

c++ - 可以简化这个表达式吗?

c++ - 从 C++ 模板参数包编译时间数组

C++ 基于输入参数的返回类型推导

c++ - 是否可以声明一个类而不实现它? (C++)

c++ - C/C++ - 检查今天是否是本月的第一个星期一

C++ string data() 函数使引用和指针无效?

c++ - 我可以在 C++ 的映射结构中使用 vector 作为索引吗?

c++ - 不可 move -不可复制对象的 vector 的 move 分配不编译