Created on 2019-08-23.00:00:00, last changed 2019-09-14.17:05:44.
This wording is relative to N4830.
Modify [move.iter.cons] as indicated:
Constructs a move_iterator, value-initializ ingcurrent. Iterator operations applied to the resulting iterator have defined behavior if and only if the corresponding operations are defined on a value-initialized iterator of type Iterator.constexpr explicit move_iterator(Iterator i);
Constructs a move_iterator, initializ ingcurrent with std::move(i).template<class U> constexpr move_iterator(const move_iterator<U>& u);
-3- Mandates:-4- Effects:
Uis convertible to Iterator. Constructs a move_iterator, initializ ingcurrent with u.base().template<class U> constexpr move_iterator& operator=(const move_iterator<U>& u);
-5- Mandates:-6- Effects: Assigns u.base() to current.
U is convertible to Iterator.
[ 2019-09-14 Priority set to 2 based on reflector discussion ]
The converting constructor and assignment operator specified in [move.iter.cons] were technically broken before P1207:
[move.iter.cons] para 3 (and 5 for that matter) is an instance of LWG 3105; it should instead mandate that u.base() is convertible to Iterator.
[move.iter.cons] para 5 uses "is convertible" to guard an assignment operation instead of a conversion; it should instead mandate.
After applying P1207R4 "Movability of Single-pass Iterators", u.base() is not always well-formed, exacerbating the problem. These operations must ensure that u.base() is well-formed.Drive-by:
Let's burninate "Constructs a move_iterator" while we're touching this subclause.
We'll also burninate "Iterator operations applied..." since the requirement it wants to impose is covered (and indeed must be covered) by the specifications of those other operations.
|2019-09-14 17:05:44||admin||set||messages: + msg10616|
|2019-08-27 18:28:02||admin||set||messages: + msg10586|