是否存在堆分配对象的永不为空的唯一所有者?

Is there a never-null unique owner of heap allocated objects?

目前,我正在存储 std::unique_ptr 的集合以堆分配多态类型的对象:

struct Foo {
  virtual ~Foo() = default;
};
Collection<std::unique_ptr<Foo>> foos;

我需要的基本接口是将 Foo 的所有者放入/从 foos 获取/获取。存储在 foos 中的对象永远不应该是 nullptr 所以我想用编译时检查替换运行时 assert(owner_taken) 。此外,我希望能够在可能需要可空所有者的上下文中使用非空所有者。

可能,我需要存储类似 unique_ref 的东西,但我如何从 foos 中提取一个?我不想要副本,我想要存储的对象本身,所以 owner->clone() 不是解决方案。我也不能 std::move(owner) 因为 "unique reference" 的状态之后会无效。

是否有干净的设计决策?

Is there a never-null unique owner of heap allocated objects?

标准库中没有这样的类型。

这种类型是可以实现的。只需定义一个带有 unique_ptr 成员的类型,并将默认构造函数标记为已删除。您还可以将来自 std::nullptr_t 的构造函数标记为已删除,以便在编译时阻止来自 nullptr 的构造函数。

无论您是从外部指针构造,还是在构造函数中分配,都无法在运行时检查 null。