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

### 2698. Effect of `assign()` on iterators/pointers/references

Section: 24.2.4 [sequence.reqmts] Status: C++17 Submitter: Tim Song Opened: 2016-04-25 Last modified: 2017-07-30

Priority: 0

View other active issues in [sequence.reqmts].

View all other issues in [sequence.reqmts].

View all issues with C++17 status.

Discussion:

The sequence container requirements table says nothing about the effect of `assign()` on iterators, pointers or references into the container. Before LWG 2209 (and LWG 320 for `std::list`), `assign()` was specified as "erase everything then `insert`", which implies wholesale invalidation from the "erase everything" part. With that gone, the blanket "no invalidation" wording in 24.2.2.1 [container.requirements.general]/12 would seem to apply, which makes absolutely no sense.

The proposed wording below simply spells out the invalidation rule implied by the previous "erase everything" wording.

[2016-05 Issues Telecon]

This is related to 2256

Proposed resolution:

This wording is relative to N4582.

1. In 24.2.4 [sequence.reqmts], edit Table 107 (Sequence container requirements) as indicated:

   > Table 107 — Sequence container requirements (in addition to container)
   > Expression | Return type | Assertion/note pre-/post-condition
   > --- | --- | ---
   > `[…]`
   > `a.assign(i, j)` | `void` | Requires: `T` shall be `EmplaceConstructible` into `X` from `*i` and assignable from `*i`. For `vector`, if the iterator does not meet the forward iterator requirements (24.2.5), `T` shall also be `MoveInsertable` into `X`. Each iterator in the range `[i, j)` shall be dereferenced exactly once. pre: `i`, `j` are not iterators into `a`. Replaces elements in `a` with a copy of `[i, j)`. Invalidates all references, pointers and iterators referring to the elements of `a`. For `vector` and `deque`, also invalidates the past-the-end iterator.
   > `[…]`
   > `a.assign(n, t)` | `void` | Requires: `T` shall be `CopyInsertable` into `X` and `CopyAssignable`. pre: `t` is not a reference into `a`. Replaces elements in `a` with `n` copies of `t`. Invalidates all references, pointers and iterators referring to the elements of `a`. For `vector` and `deque`, also invalidates the past-the-end iterator.