Date: Thu, 25 May 2023 15:32:38 +0100
On Thu, 25 May 2023 at 14:26, Edward Catmur <ecatmur_at_[hidden]> wrote:
> On Thu, 25 May 2023 at 05:21, Jonathan Wakely via Std-Proposals <
> std-proposals_at_[hidden]> wrote:
>
>> On Thu, 25 May 2023 at 11:11, Frederick Virchanza Gotham via
>> Std-Proposals <std-proposals_at_[hidden]> 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.
>
>
> On Thu, 25 May 2023 at 05:21, Jonathan Wakely via Std-Proposals <
> std-proposals_at_[hidden]> wrote:
>
>> On Thu, 25 May 2023 at 11:11, Frederick Virchanza Gotham via
>> Std-Proposals <std-proposals_at_[hidden]> 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.
>
>
Received on 2023-05-25 14:32:53