Created on 2018-02-05.00:00:00 last changed 83 months ago
[ 2018-02-13, Priority set to 3 after mailing list discussion ]
What are the requirements for
a = b;
... where a and b are of map-like associative container type (map, multimap, unordered_map, unordered_multimap)?
The general container requirements say just:r = a // Postconditions: r == a
(Incidentally, earlier in the table, there is a clear error: the general container requirements permit "a = rv" for assignment from an rvalue, but "a" here is a potentially-const container. Oops.) Oddly. there are no requirements at all on T here.
The allocator-aware container requirements add:a = t // Requires: T is CopyInsertable into X and CopyAssignable.
... where T is the container's value_type, that is, pair<const key_type, mapped_type>. Note that such a pair is not CopyAssignable for "normal" key types that disallow assignment to const objects. They also add:
a = rv // Requires: if !POCMA, T is MoveInsertable into X and MoveAssignable.
... which has the same problem in the !POCMA case.
The associative container requirements and unordered associative container requirements have a similar problem for assignment from an initializer list:a = il // Requires: value_type is CopyInsertable into X and CopyAssignable.
Presumably these assignments are intended to actually work, but what are the intended constraints? Do we wish to allow implementations to perform node reuse for these map-like containers? Presumably yes, and if so, the key_type portion of the node must be assigned as well as the value_type portion (for instance, with whatever implementation technique is used to power node_handle) as we cannot assume that key equivalence (or, for unordered_*map, even key equality) implies substitutability.
I think, then, that the associative container requirements and unordered associative container requirements should specify different requirements for the "a = t", "a = rv", and "a = il" for the map-like containers; specifically:for "a = t" and "a = il", we should require that value_type is CopyInsertable into X, and key_type and mapped_type are CopyAssignable
for "a = rv", if !POCMA, we should require that value_type is MoveInsertable into X and key_type and mapped_type are MoveAssignable
(And we should fix the general container requirements to constrain "r = rv", not "a = rv".)
Daniel: The "a = rv" problematic is already handled by LWG 3028.History | |||
---|---|---|---|
Date | User | Action | Args |
2018-02-14 19:34:02 | admin | set | messages: + msg9682 |
2018-02-05 00:00:00 | admin | create |