缺少共享引用

abe*_*ier 5 c++ refcounting c++11

在进行std::shared_ptr大量工作时,我有点怀念shared_ref实现的过程。这是 的特化shared_ptr,它保证它永远不会包装 a 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 );
};
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 3

执行过程中是否存在市长问题?

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

不,这也不会飞:

shared_ref( T&& ref ) : p(&ref) {}
Run Code Online (Sandbox Code Playgroud)

用户可能给了您一个堆栈变量,这现在意味着您在该对象和堆栈变量之间拥有“共享”所有权。并且堆栈变量不能与某些东西共享所有权。

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

您能做的绝对最好的事情就是创建一个与 等效的接口,shared_ptr只不过它没有默认构造函数,并且在给定 NULL 的情况下会抛出异常。这真的值得创建一个全新的指针类型吗?


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

当然,您不能强迫其他人使用它们,但一致使用该类型将解决问题。

  • 另外,也许这个名字是错误的——也许“shared_obj”可能是更正确的名字!? (2认同)