Title
Effect of assign() on iterators/pointers/references
Status
c++17
Section
[sequence.reqmts]
Submitter
Tim Song

Created on 2016-04-25.00:00:00 last changed 81 months ago

Messages

Date: 2016-05-22.15:38:38

Proposed resolution:

This wording is relative to N4582.

  1. In [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.
Date: 2017-02-02.00:41:18

[ 2016-05 Issues Telecon ]

This is related to 2256

Date: 2016-04-25.00:00:00

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 [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.

History
Date User Action Args
2017-07-30 20:15:43adminsetstatus: wp -> c++17
2016-06-28 12:50:44adminsetstatus: ready -> wp
2016-05-22 15:38:38adminsetmessages: + msg8141
2016-05-22 15:38:38adminsetstatus: new -> ready
2016-05-08 11:39:51adminsetmessages: + msg8094
2016-04-25 00:00:00admincreate