-->

缺少shared_ref(Missing shared_ref)

2019-07-30 06:52发布

虽然有工作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 );
};

Answer 1:

有没有实现时,它的任何问题,市长?

这里有一个:你不能把一个参考的所有权。 智能指针的整点是要求指针本身的所有权。 shared_ref不行,因为你无法控制的参考的寿命。

不,这是不会飞之一:

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

用户可给你堆栈变量,现在意味着你有此对象和一个堆栈变量之间“共享”的所有权。 和堆栈变量不能用的东西股权。

你只能控制指针的寿命。 和指针可以为NULL。 因此,你能做的唯一的事情就是运行时检查,看是否有指针为NULL。

你能做的最好的绝对是一个接口相当于shared_ptr不同之处在于它没有默认构造函数和报错NULL的情况下抛出。 这真的值得创建一个全新的指针类型了吗?


C ++的核心准则支持库具有not_null模板,该模板可应用于大多数类指针类型。 所以,你可以使用not_null<shared_ptr>如果您想验证一个指针不为NULL,但是当它进入使用一次。 指针的初始创建后,它并不需要再次检查。

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



Answer 2:

只有两个方法可让shared_ptr为空-无论它是默认的构造,也被分配在某一点空值。 既然你已经同意这是没有意义的默认构造你的假设shared_ref类,即只留下第二个条件。

如果你试图将分配nullptrshared_ref对象,你会期待发生什么呢? 如果它抛出一个错误? 这是微不足道的做同样的事情用一个普通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());

一般来说,除非有没有简单的解决方法迫切需要的东西不会添加到标准。



文章来源: Missing shared_ref