Missing shared_ref

Missing shared_ref

本文关键字:ref shared Missing      更新时间:2023-10-16

在与std::shared_ptr一起工作时,我有点错过了shared_ref实现。这是shared_ptr的专业化,它保证了它永远不会包装nullptr(当然,前提是正确的用法)。我有点想知道为什么它不在 C++11 标准中。实施时有市长问题吗?在我的头顶上,我想不出任何东西。

编辑:

我希望有一个类似于以下内容的界面:

template <typename T>
class shared_ref {
public:
  shared_ref( T&& ref );
  T& get();
  T* operator&() const;
  template< class Y > 
  void reset( Y&& obj );
  long use_count() const;
  bool unique() const;
  void swap( shared_ref& r );
};

实施时有市长问题吗?

这里有一个:你不能拥有参考的所有权。智能指针的全部意义在于声明指针本身的所有权。 shared_ref无法工作,因为您无法控制引用的生存期。

不,这也不会飞:

shared_ref( T&& ref ) : p(&ref) {}

用户可能已经为您提供了一个堆栈变量,这意味着您在此对象和堆栈变量之间拥有"共享"所有权。堆栈变量不能与某些东西共享所有权。

您只能控制指针的生存期。指针可以为 NULL。因此,您唯一能做的就是运行时检查指针是否为 NULL。

你能做的绝对最好的事情是等效于shared_ptr的接口,除了它没有默认构造函数并在给定 NULL 时抛出。这真的值得创建一个全新的指针类型吗?


C++核心指南支持库具有not_null模板,该模板可应用于大多数类似指针的类型。因此,当您想要验证指针是否为 NULL 时,可以使用 not_null<shared_ptr>,但只能在它进入使用时使用一次。初始创建指针后,无需再次检查。

当然,你不能强迫其他人使用它们,但始终如一地使用该类型将解决问题。

shared_ptr只有

两种方式为 null - 要么是默认构造的,要么是在某些时候被分配了一个 null 值。由于您已经同意默认构造假设的shared_ref类是没有意义的,因此只剩下第二个条件。

如果您尝试为shared_ref对象分配nullptr,您希望发生什么?它应该抛出错误吗?使用简单的模板函数对常规shared_ptr执行相同的操作是微不足道的:

template<typename T>
T* notnull(T* ptr)
{
    if (ptr == std::nullptr)
        throw std::invalid_argument(std::string("nullptr"));
    return ptr;
}
std::shared_ptr<int> pint = notnull(GetIntPtr());

通常,除非有迫切的需求并且没有简单的解决方法,否则不会将事情添加到标准中。