在使用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/