虽然有工作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
模板,该模板可应用于大多数类指针类型。 所以,你可以使用not_null<shared_ptr>
如果您想验证一个指针不为NULL,但是当它进入使用一次。 指针的初始创建后,它并不需要再次检查。
当然,你不能强迫其他人使用它们,但使用的类型始终将解决此问题。
只有两个方法可让shared_ptr
为空-无论它是默认的构造,也被分配在某一点空值。 既然你已经同意这是没有意义的默认构造你的假设shared_ref
类,即只留下第二个条件。
如果你试图将分配nullptr
您shared_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());
一般来说,除非有没有简单的解决方法迫切需要的东西不会添加到标准。