$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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
   {
   public:
      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 http://www.sig.com Susquehanna International Group, LLP using std::disclaimer;