|
Boost : |
From: Fernando Cacciola (fcacciola_at_[hidden])
Date: 2002-04-24 11:35:19
"Peter Dimov" <pdimov_at_[hidden]> wrote in message
news:000501c1eb7a$0f4a2760$1d00a8c0_at_pdimov2...
> I've changed the shared_ptr(T *) constructor to a member template,
> template<class Y> shared_ptr(Y *).
>
I've just looked at it.
Why is the cast from Y* to T* implicit?
AFAIK this could go wrong when complex polymorphism is involved:
shared_ptr<Base> pb( new Derived ) ;
My own smart ptr has both template and non template ctors.
The template ctor uses boost::polymorphic_cast.
(And similarly, assignment and reset have also both versions)
> This allows code like shared_ptr<void> pv(new int) or shared_ptr<X> px(new
> Y) (where X doesn't have a virtual destructor) to do the right thing. The
> former equivalent was the more verbose shared_ptr<X> px =
shared_ptr<Y>(new
> Y).
>
> This breaks some existing code since '0' is no longer an acceptable
> argument; for instance, px.reset(0) needs to be rewritten as px.reset().
>
I think this could be resolved by having both template and non-template
versions.
> I'm still undecided about the case where Y is derived from counted_base.
The
> current behavior doesn't detect this and allocates an external reference
> count; having two separate reference counts for the same object is almost
> always a mistake.
>
Indeed.
> On the other hand, making the constructor autodetect is a semantic
overload
> (a single function with multiple behaviors) which is typically to be
avoided
> (it breaks the use_count() == 1 postcondition in some cases.)
>
Isn't it broke already when using the ctor from intrusive_ptr<>?
FWIW, I have my own intrusive smart pointer, and boost::shared_ptr. I've
never needed to convert between them, so I wonder why should they
interoperate.
-- Fernando Cacciola Sierra s.r.l. fcacciola_at_[hidden] www.gosierra.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk