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