Section: 26.2.3 [sequence.reqmts] Status: C++17 Submitter: Tim Song Opened: 2016-04-25 Last modified: 2017-07-30
View other active issues in [sequence.reqmts].
View all other issues in [sequence.reqmts].
View all issues with C++17 status.
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 26.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
This wording is relative to N4582.
In 26.2.3 [sequence.reqmts], edit Table 107 (Sequence container requirements) as indicated:
Table 107 — Sequence container requirements (in addition to container) Expression Return type Assertion/note
[…] 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).
[…] 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.