Boost logo

Boost :

From: Rob Stewart (stewart_at_[hidden])
Date: 2005-08-17 08:58:10

From: Jonathan Wakely <cow_at_[hidden]>
> Axter wrote:
> >
> > It does not need a clone member if you apply strict pointer ownership logic,
> > which is what a clone pointer normally does.
> But there is nothing to prevent users from misusing it (not even much
> documentation!) I would expect a very prominent warning saying you MUST
> NOT create a clone_ptr from a pointer with a different static type to
> its dynamic type.

You could at least offer a runtime check for misuse by comparing
type_ids for the static and dynamic types:

   template <class T>
   class clone_ptr
      template <class U>
      clone_ptr(U * p)
         BOOST_ASSERT(typeid(U) == typeid(p));

You can decide whether that test should occur in all builds.

> > If you create the object by passing it directly to the constructor, it will
> > be able to clone itself with no problems.
> I realise that, but it means you can't use clone_ptr in many situations.
> The following code applies strict pointer ownership, but is still wrong:
> struct Base { ~Base() {} };
> std::auto_ptr<Base> factory();
> int main() {
> std::auto_ptr<Base> ap = factory();
> clone_ptr<Base> cp(ap.get()); // slice!
> ap.release();
> }

The suggestion above won't detect that at compile time, but it
will detect it.

Rob Stewart                           stewart_at_[hidden]
Software Engineer           
Susquehanna International Group, LLP  using std::disclaimer;

Boost list run by bdawes at, gregod at, cpdaniel at, john at