Hi!

I'm under the process of getting rid of some of my old
smart pointers replacing them by shared_ptr<>.
There is however one idiomatic usage that it's pretty
hard to locate and edit, so I wondered if shared_ptr<>
could support it.
One is initialization from a null pointer value, as in:

struct C
{
  C() : ptr(0) {}

  shared_ptr<X> ptr ;
} ;

this one is very useful because its very idiomatic.

The other one, definitely not recommended but which *I* need
to support because my code if full of it,
is assignment of a null pointer value as a synonym for reset(),
as in:

struct C
{
  C() : ptr(0) {}

  void clear()
  {
    ptr = 0 ; // the same as ptr.reset();
  }

  shared_ptr<X> ptr ;
} ;

AFAICT, these can be _safely_ supported in shared_ptr<>
by simply adding these:

explicit shared_ptr( unspecified_bool_type const null_ptr_value ): px(0),
pn() // never throws in 1.30+
{
  BOOST_ASSERT( null_ptr_value == 0);
}
shared_ptr& operator = ( unspecified_bool_type const null_ptr_value )
{
  BOOST_ASSERT( null_ptr_value == 0);
  reset();
  return *this ;
}

I've tested it with bcc5.5.1 and the following holds:

T value ;
T* ptr = &value ;
shared_ptr<T> pa(ptr); // OK
shared_ptr<T> pb(0) ; // OK.
sahred_ptr<T> pc(1) ; // ERROR

pa = ptr ; // ERROR
pa = 0 ; // OK
pa = 1 ; // ERROR

What do you think?

Fernando Cacciola

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to