"Peter Dimov" <[EMAIL PROTECTED]> wrote in message 004f01c2c921$aae010b0$1d00a8c0@pdimov2">news:004f01c2c921$aae010b0$1d00a8c0@pdimov2... > From: "David B. Held" <[EMAIL PROTECTED]> > > > > smart_ptr(P p) > > : storage(p), ownership(p), checking(), conversion() > > { checking::on_init(p) } > > smart_ptr(P p) > : storage(p), ownership(p), checking(p), conversion() > {} > > is nicer. Maybe even conversion(p), for consistency. :-)
Well, if you want consistency, "on_init(p)" is better. ;) Technically, one could argue that you might want checking to occur *after* the other policy c'tors have completed. > But that's not what I have in mind. There are a number of pitfalls > awaiting you. Tell me something new. :( > Consider the converting move constructor: > > smart_ptr(smart_ptr & rhs) > : storage(rhs), ownership(rhs), checking(rhs), conversion(rhs) > {} > > Its purpose is to take ownership away from the auto_ptr-like rhs > (you wanted to support that) and construct a counted_ptr. Hmm...I'm not so sure about constructing a ref-counted pointer from a move pointer. That's an interesting idea that I hadn't really considered. I'm not sure whether it's a good idea to allow that or not. It might encourage indiscriminate mixing of pointer types. > As storage is constructed first, it needs to move from rhs.storage; > now when ownership throws, rhs.storage will be left empty, and the > object is gone. This is not that big of a problem... provided that the > other rhs policies can handle storage being zeroed. They'd better be able to handle this, since is this is what would happen in the *non-exceptional* case as well. However, the other policies had better not be able to tell whether or not storage is zeroed, or we have lost orthogonality. A more interesting related problem involves what to do when transferring a managed resource. When tranferring an unmanaged resource, you have to clean it up on an exception, just to get the basic guarantee. However, when moving from a managed pointer, cleaning up will only *get* you the basic guarantee. To get the strong guarantee, you need to *move the resource back*. This is a tricky situation that might be a good argument to not support move semantics. ;) Or maybe the strong guarantee isn't important for this. I dunno. Comments? > [...] > In short, trying to support auto_ptr, shared_ptr, and weak_ptr will > either destroy the design, or make it stronger. :-) Well, considering there isn't a configuration of "the runtime Borg" for weak_ptr, I wouldn't feel too bad not supporting it internally. Besides, weak_ptr isn't even "smart" to begin with. ;) We'll cover that with a policy-based "DumbPtr". ;> Dave _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost