From: Peter Dimov (pdimov_at_[hidden])
Date: 2002-06-24 04:32:41
From: "Markus Schöpflin" <markus.schoepflin_at_[hidden]>
> Peter Dimov wrote:
> > From: "Markus Schöpflin" <markus.schoepflin_at_[hidden]>
> > > Hello all,
> > >
> > > I have a problem with MSVC6 and shared_ptr. The compiler
> > > is hopelessly confused by the template constructor:
> > >
> > > template<typename Y> explicit shared_ptr(Y * p)
> > >
> > > As a result, it fails to compile:
> > >
> > > boost::shared_ptr<int> p(0);
> > This is as it should be. Either use the default constructor, or cast the
> > zero to the correct pointer type.
> Ok, thanks for the clarification. Is there anywhere some design
> rationale besides the FAQ where I can look up what should work
> and what not and why it works the way it does?
First let me clarify that this is not a problem with MSVC 6. 'Y *' can not
be deduced from '0'.
No, there is no rationale document yet. Sorry.
The reason that the zero initialization doesn't work (1.28+) is that the two
constructors are subtly different; ...
> For me this behaviour is kind of surprising as auto_ptr does
> have such a constructor.
... in the auto_ptr/scoped_ptr case, the default constructor _is_
zero-initialization. shared_ptr's default constructor, however, does not
require a complete type, and does not invoke 'delete' on destruction. The
constructor that takes a raw pointer does require a complete type for the
pointed-to object, and does invoke 'delete p' on destruction, where 'p' is
the value passed to the constructor, complete with its original type.
So if you say
when 'px' is destructed, it will invoke
I could have made the simple case
work, but it's better not to; it is important to understand the difference.
And of course,
won't work anyway, since void is incomplete.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk