Issue 1206: Incorrect requires for move_backward and copy_backward (original) (raw)


This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++11 status.

1206. Incorrect requires for move_backward and copy_backward

Section: 26.7.2 [alg.move] Status: C++11 Submitter: Howard Hinnant Opened: 2009-09-13 Last modified: 2016-01-28

Priority: Not Prioritized

View all issues with C++11 status.

Discussion:

26.7.2 [alg.move], p6 says:

template<class BidirectionalIterator1, class BidirectionalIterator2> BidirectionalIterator2 move_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result);

...

Requires: result shall not be in the range[first,last).

This is essentially an "off-by-one" error.

When result == last, which_is_ allowed by this specification, then the range [first, last)is being move assigned into the range [first, last). The move(forward) algorithm doesn't allow self move assignment, and neither shouldmove_backward. So last should be included in the range whichresult can not be in.

Conversely, when result == first, which is not allowed by this specification, then the range [first, last)is being move assigned into the range [first - (last-first), first). I.e. into a non-overlapping range. Therefore first should not be included in the range which result can not be in.

The same argument applies to copy_backward though copy assigning elements to themselves (result == last) should be harmless (though is disallowed by copy).

[ 2010 Pittsburgh: Moved to Ready. ]

Proposed resolution:

Change 26.7.2 [alg.move], p6:

template<class BidirectionalIterator1, class BidirectionalIterator2> BidirectionalIterator2 move_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result);

...

Requires: result shall not be in the range~~[~~(first,last]~~)~~.

Change 26.7.1 [alg.copy], p13:

template<class BidirectionalIterator1, class BidirectionalIterator2> BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result);

...

Requires: result shall not be in the range~~[~~(first,last]~~)~~.