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