On Thu, 25 May 2023 at 14:26, Edward Catmur <ecatmur@googlemail.com> wrote:
On Thu, 25 May 2023 at 05:21, Jonathan Wakely via Std-Proposals <std-proposals@lists.isocpp.org> wrote:
On Thu, 25 May 2023 at 11:11, Frederick Virchanza Gotham via Std-Proposals <std-proposals@lists.isocpp.org> wrote:
Today I was re-working code that works with pointers to elements
inside an 'std::list'. Then at one point I wanted to erase an element
from the container, but to do so efficiently/properly, I needed an
iterator rather than a pointer.

So I refactored the code to use iterators instead of pointers. But of
course, you can't have a null iterator -- and I don't want to use

For forward iterators you can use a value-initialized iterator as a null iterator. Any valid iterator is guaranteed to compare non-equal with a value-initialized iterator, and any two value-initialized iterators are guaranteed to compare equal.

I don't think that's right; my reading of [forward.iterators]/2 is that each instance of a container defines a comparison domain, and singular iterators are in their own distinct domain.

Ah yes, you can only compare value-init'd iterators to *other* value-init'd iterators.

 

btw, _GLIBCXX_DEBUG agrees with me, and IIRC MSVC-STL _ITERATOR_DEBUG_LEVEL as well: https://godbolt.org/z/nEG8Gaosq

#include <list>
int main() {
    return std::list<int>().begin() == std::list<int>::iterator();
}
Error: attempt to compare a past-the-end iterator to a
singular (value-initialized) iterator.