The move-related changes inadvertently overwrote the intent of 276. Issue 276 removed the requirement of CopyAssignable from most of the member functions of node-based containers. But the move-related changes unnecessarily introduced the MoveAssignable requirement for those members which used to require CopyAssignable.
We also discussed (c++std-lib-18722) the possibility of dropping MoveAssignable from some of the sequence requirements. Additionally the in-place construction work may further reduce requirements. For purposes of an easy reference, here are the minimum sequence requirements as I currently understand them. Those items in requirements table in the working draft which do not appear below have been purposefully omitted for brevity as they do not have any requirements of this nature. Some items which do not have any requirements of this nature are included below just to confirm that they were not omitted by mistake.
X u(a) | value_type must be CopyConstructible |
X u(rv) | array requires value_type to be CopyConstructible |
a = u | Sequences require value_type to be CopyConstructible and CopyAssignable. Associative containers require value_type to be CopyConstructible. |
a = rv | array requires value_type to be CopyAssignable. Sequences containers with propagate_on_container_move_assignment == false allocators require value_type to be MoveConstructible and MoveAssignable. Associative containers with propagate_on_container_move_assignment == false allocators require value_type to be MoveConstructible. |
swap(a,u) | array requires value_type to be Swappable. |
X(n) | value_type must be DefaultConstructible |
X(n, t) | value_type must be CopyConstructible |
X(i, j) | Sequences require value_type to be constructible from *i. Additionally if input_iterators are used, vector and deque require MoveContructible and MoveAssignable. |
a.insert(p, t) | The value_type must be CopyConstructible. The sequences vector and deque also require the value_type to be CopyAssignable. |
a.insert(p, rv) | The value_type must be MoveConstructible. The sequences vector and deque also require the value_type to be MoveAssignable. |
a.insert(p, n, t) | The value_type must be CopyConstructible. The sequences vector and deque also require the value_type to be CopyAssignable. |
a.insert(p, i, j) | If the iterators return an lvalue the value_type must be CopyConstructible. The sequences vector and deque also require the value_type to be CopyAssignable when the iterators return an lvalue. If the iterators return an rvalue the value_type must be MoveConstructible. The sequences vector and deque also require the value_type to be MoveAssignable when the iterators return an rvalue. |
a.erase(p) | The sequences vector and deque require the value_type to be MoveAssignable. |
a.erase(q1, q2) | The sequences vector and deque require the value_type to be MoveAssignable. |
a.clear() | |
a.assign(i, j) | If the iterators return an lvalue the value_type must be CopyConstructible and CopyAssignable. If the iterators return an rvalue the value_type must be MoveConstructible and MoveAssignable. |
a.assign(n, t) | The value_type must be CopyConstructible and CopyAssignable. |
a.resize(n) | The value_type must be DefaultConstructible. The sequence vector also requires the value_type to be MoveConstructible. |
a.resize(n, t) | The value_type must be CopyConstructible. |
a.front() | |
a.back() | |
a.push_front(t) | The value_type must be CopyConstructible. |
a.push_front(rv) | The value_type must be MoveConstructible. |
a.push_back(t) | The value_type must be CopyConstructible. |
a.push_back(rv) | The value_type must be MoveConstructible. |
a.pop_front() | |
a.pop_back() | |
a[n] | |
a.at[n] |
X(i, j) | If the iterators return an lvalue the value_type must be CopyConstructible. If the iterators return an rvalue the value_type must be MoveConstructible. |
a_uniq.insert(t) | The value_type must be CopyConstructible. |
a_uniq.insert(rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible. |
a_eq.insert(t) | The value_type must be CopyConstructible. |
a_eq.insert(rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible. |
a.insert(p, t) | The value_type must be CopyConstructible. |
a.insert(p, rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible. |
a.insert(i, j) | If the iterators return an lvalue the value_type must be CopyConstructible. If the iterators return an rvalue the key_type and the mapped_type (if it exists) must be MoveConstructible.. |
X(i, j, n, hf, eq) | If the iterators return an lvalue the value_type must be CopyConstructible. If the iterators return an rvalue the value_type must be MoveConstructible. |
a_uniq.insert(t) | The value_type must be CopyConstructible. |
a_uniq.insert(rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible. |
a_eq.insert(t) | The value_type must be CopyConstructible. |
a_eq.insert(rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible. |
a.insert(p, t) | The value_type must be CopyConstructible. |
a.insert(p, rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible. |
a.insert(i, j) | If the iterators return an lvalue the value_type must be CopyConstructible. If the iterators return an rvalue the key_type and the mapped_type (if it exists) must be MoveConstructible.. |
map[lvalue-key] | The key_type must be CopyConstructible. The mapped_type must be DefaultConstructible and MoveConstructible. |
map[rvalue-key] | The key_type must be MoveConstructible. The mapped_type must be DefaultConstructible and MoveConstructible. |