"David Abrahams" <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> [...]
>   C) Make sure the first base class of smart_ptr is the one that
>      manages destruction of its resources:
>
>   template <class Storage, class Ownership>
>   struct ptr_manager
>      : Storage, Ownership
>   {
>      ptr_manager(ptr_manager const& p) : Storage(p), Ownership(p) {}
>
>      ~ptr_manager()
>      {
>          if (!this->Ownership::release(get_impl(*this)))
>          {
>              this->Storage::release();
>          }
>       }
>   };
>
>    smart_ptr::smart_ptr(smart_ptr const& rhs)
>       : ptr_manager(rhs), checking(rhs), conversion(rhs)
>    { checking::on_init(p); }

I was actually thinking in this direction somewhat.  I did notice that it
really is the smart_ptr d'tor that really knows how to properly clean
stuff up, and it should probably be the one to do so.  This might be
the way to go.

> [...]
> I think that whatever orthogonal concepts are being represented
> by ownership and storage here (and I'm really not sure I see a
> clear separation), they must be sub-concepts of what is normally
> referred to as ownership.  You can see that from the fact that you
> need a sub-object to group them together to handle resource
> lifetime correctly.  I would explore/discuss the implications of not
> separating ownership and storage to see whether it's buying you
> more than it's costing.

There are several cases where it's clear that storage and ownership
aren't the same thing.  First, is scalar_storage vs. array_storage.
Second, is pointer vs. other resource.  Pointers to arrays benefit
from all of the ownership strategies provided by SmartPtr that
pointers to objects enjoy.  A smart resource can certainly make
use of ref-counting, deep copy, no-copy, and move semantics.  I
think it's clear that with respect to these ideas, storage and ownership
are indeed orthogonal.  Merging them would evoke a combinatorial
explosion of the nature hinted at by scoped_ptr, shared_ptr,
scoped_array, shared_array, (scoped_resource, shared_resource,
deep_ptr, deep_array, deep_resource, intrustive_ptr,
intrusive_resource, com_ptr, com_resource, etc.).

It's unfortunate that they must interact, but I do believe that they are
orthogonal in principle.  However, your intermediate class might be
the most appropriate decomposition.  I'm leaning towards that
pending further insight/analysis.

> BTW, I don't want to beat this to death, but addressing the issue
> of most compilers not doing the EBO for anything other than the
> first base class has a huge bearing on all of this,

Well, I want to at least give the VC++ guys a few days to see if
they say anything.  I posted a question on a M$ newsgroup.  I
think I did the first time around, too, and they didn't.  It would be
really cool if, say, Jason Shirk offered some insight, or at least
knocked some skulls so we got *some* kind of answer, even if
it's "there's no way in heck we will give out that kind of
information".  At least then I could give up hope, and we could
fully enter the tedious debate over alternatives.  But there must
be *someone* on the VC++ compiler team that wrote the EBO
code, and if it were me, I'd have enough pride to at least say
when I know that it *does* work (and it does work for some
MI...optimally_inherit was doing its job until the latest round of
changes).  Bueller?  Bueller?  Bueller?

Dave



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

Reply via email to