It's a weird corner of shared_ptr
behavior. It has a constructor that allows you to make a shared_ptr
that owns something and points to something else:
template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );
The shared_ptr
constructed using this constructor shares ownership with r
, but points to whatever ptr
points to (i.e., calling get()
or operator->()
will return ptr
). This is handy for cases where ptr
points to a subobject (e.g., a data member) of the object owned by r
.
The page you linked calls a shared_ptr
that owns nothing empty, and a shared_ptr
that points to nothing (i.e., whose get() == nullptr
) null. (Empty is used in this sense by the standard; null isn't.) You can construct a null-but-not-empty shared_ptr
, but it won't be very useful. An empty-but-not-null shared_ptr
is essentially a non-owning pointer, which can be used to do some weird things like passing a pointer to something allocated on the stack to a function expecting a shared_ptr
(but I'd suggest punching whoever put shared_ptr
inside the API first).
boost::shared_ptr
also has this constructor, which they call the aliasing constructor.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…