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: 27.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:

27.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 27.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 27.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])`.