
On Saturday 26 April 2008 09:56, Daniel Frey wrote:
On Sat, 2008-04-26 at 15:45 +0300, Peter Dimov wrote:
Are you sure that you need to test for emptiness instead of expiration?
I'm not sure, because I don't know what is expected. I initially used .use_count() != 0, but it triggered a problem in esft_constructor_test.cpp, line 131. I already asked Frank for more information/documentation about what (the new) esft should support, but he said that there is no documentation, instead he pointed me to the regression tests, so I figured I need to make them pass. With .empty(), they do.
When looking at the test case that fails with .use_count() != 0, I don't really see why the call to shared_from_this() in line 130 should throw. Shouldn't the call alone be legal? The only illegal thing I could spot in this test case is, that after calling x.shared_from_this() no other shared_ptr takes ownership of x.
Yes, it seemed safer to make the shared_ptr from shared_from_this() calls share ownership with a well-defined external shared_ptr (that is, the first shared_ptr to take ownership). That seemed to minimize the ambiguity and possibility of dangling shared_ptr. The behavior of the classic esft is different, shared_from_this() returns shared_ptr that share ownership with the last shared_ptr to take ownership. Another possibility, which you seem to be suggesting, would be to always handle the "no owner exists" case by having shared_from_this() return shared_ptr that will share ownership with the next external shared_ptr to take ownership. In any case, the exact behavior of shared_from_this wrt multiple owners has never been specified as far as I know. -- Frank