At 06:24 PM 1/30/2003, Howard Hinnant wrote:
>On Tuesday, January 28, 2003, at 11:19  PM, Greg Colvin wrote:
>
>>My problem with auto_ptr isn't so much the semantics, which
>>have proved useful and are probably the minimum needed to
>>solve the problem that the committee wanted solved.  And it
>>isn't so much the "move as copy" syntax that Howard dislikes.
>
>I just read in a newsgroup post today:
>
>>I tried to apply predicate version of std::sort algorithm to vector<
>>auto_ptr<MyClass> > using my predicate. Sometimes, some of auto_ptr loses
>>the ownership while sorting. What is happening?
>
>Now we all know that vector<auto_ptr<MyClass> > won't compile, so this really 
>shouldn't be a problem.
>
>But it still IS a problem, because this does compile:

Sigh...

To be clear, I'll be happy to see a better syntax
in the next standard -- auto_ptr was the best we
could do with the syntax we had, but ...


>#include <the proper stuff>
>
>void foo()
>{
>     auto_ptr< MyClass > ia[100];
>     ... fill ia
>     std::sort(ia, ia+100, the_proper_predicate);
>}
>
>This may even do the right thing.  Or it may leave an auto_ptr moved into a local 
>inside of sort, never to be heard from again.  And the reason is that sort thinks it 
>can copy an element from the range into a local temporary with:
>
>T partition = *median;
>
>If T is auto_ptr, this does a move instead of a copy, with the result that the range 
>to be sorted now no longer contains all of the elements that were supposed to be 
>sorted.  The committee recognized this danger in 1996, and redesigned auto_ptr so 
>that it would not compile if put into a std::container.  However, you can still put 
>auto_ptr into a raw array, and you can still use std::algorithms on raw arrays.  
>auto_ptr still presents a danger because it moves with copy syntax.  A better 
>solution is to move with syntax other than copy so that code like foo() shown above 
>will fail at compile time, instead of at run time (or if it does compile, will run 
>correctly).
>
>-Howard
>
>_______________________________________________
>Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

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

Reply via email to