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 formove_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 should move_backward
. So last
should be included in the range which result
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 ] )
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4