Boost logo

Boost :

From: Daniel Wallin (dalwan01_at_[hidden])
Date: 2004-01-18 17:46:01


Howard Hinnant wrote:
> <snip>
>
> Below is a brief, realistic demo of the dangers of moving with copy
> syntax from an lvalue:
>
><snip>
>
> It is safe to move from lvalues with some syntax other than copy. So
> the functionality of auto_ptr can still be had, just not with the same
> syntax. You might consider something like:
>
> http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/
> n1377.htm#move_ptr%20Example
>
> This example relies on a language feature not available to you.
> However, I believe you can emulate this behavior in today's C++ using
> the same techniques you have demonstrated.

How about:

   template<class T>
   class move_ptr
   {
   public:
       move_ptr() : m_p(0) {}

       template<class U>
       move_ptr(const move_ptr<U>& p)
           : m_p(const_cast<move_ptr<U>&>(p).release())
       {}

       explicit move_ptr(T* p) : m_p(p)
       {}

       ~move_ptr()
       {
         delete m_p;
       }

       move_ptr& operator=(move_ptr p)
       {
           p.swap(*this);
           return *this;
       }

       void reset(T* p)
       {
           move_ptr(p).swap(*this);
       }

       T* release()
       {
           T* p = m_p;
           m_p = 0;
           return p;
       }

       void swap(move_ptr& p)
       {
           std::swap(m_p, p.m_p);
       }

       T& operator*() const
       {
           return *m_p;
       }

       T* operator->() const
       {
           return m_p;
       }

   private:
       template<class U> struct cant_move_from_const;
       template<class U> struct cant_move_from_const<const move_ptr<U> >
       {
           typedef typename move_ptr<U>::error type;
       };

       template<class U>
       move_ptr(U&, typename cant_move_from_const<U>::type = 0);

       move_ptr(move_ptr&);
       template<class U> move_ptr(move_ptr<U>&);

       T* m_p;
   };

Comeau online and GCC3.3.1 seems to like it.

-- 
Daniel Wallin

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk