在使用std::shared_ptr时,我有点想念shared_ref的实现。这是shared_ptr的特化,它保证不会包装nullptr(当然,是正确的用法)。
我有点奇怪为什么它不在C++ 11标准中。实现时有市长问题吗?在我的头上,我想不出任何东西。

编辑:

我希望有一个类似于以下内容的接口(interface):

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的接口(interface),除了它没有默认构造函数并且在被赋予NULL的情况下引发。这真的值得创建一个全新的指针类型吗?

C++ Core Guidelines支持库具有not_null模板,可以将其应用于大多数类似指针的类型。因此,当您要验证指针不是NULL时,可以使用not_null<shared_ptr>,但在进入use时只能使用一次。最初创建指针后,无需再次检查。

当然,您不能强制其他人使用它们,但是始终使用该类型可以解决此问题。

关于c++ - 缺少shared_ref,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11365149/

10-12 20:50