This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of NAD status.

### 3394. `ranges::basic_istream_view::iterator` has an empty `iterator_traits`

Section: 26.6.6.3 [range.istream.iterator] Status: NAD Submitter: Patrick Palka Opened: 2020-02-09 Last modified: 2020-11-09

Priority: 2

View all other issues in [range.istream.iterator].

View all issues with NAD status.

Discussion:

Every instantiation of `ranges::basic_istream_view::iterator` has an empty `iterator_traits`, i.e. the type

>     iterator_traits<ranges::basic_istream_view<Val, CharT, Traits>::iterator>

has no members.

This happens because `basic_istream_view::iterator` neither models `cpp17-iterator` (since this concept requires copyability, which this iterator is by design not) nor does it define all four of the member types `difference_type`, `value_type`, `reference`, and `iterator_category` (it is missing `reference`). Therefore by 25.3.2.3 [iterator.traits] p3, this iterator's specialization of `iterator_traits` will be empty if generated from the `iterator_traits` primary template.

Since `basic_istream_view::iterator` is indeed an iterator, its `iterator_traits` should certainly not be empty. The simplest solution here is to define the member type `reference` in the definition of `basic_istream_view::iterator`, which will enable its `iterator_traits` specialization to be appropriately populated from the primary template.

[2020-02-10; Jonathan comments]

Jonathan and Casey have concerns about the proposed resolution. Casey: The wording makes it look as if this iterator is supposed to be an `cpp17-input-iterator`.

See also LWG 3283 and 3289.

[2020-02 Prioritized as P2 Monday morning in Prague]

Previous resolution [SUPERSEDED]:

> This wording is relative to N4849.

> 1. Modify 26.6.6.3 [range.istream.iterator], class template `basic_istream_view::iterator` synopsis, as indicated:

>    >     namespace std::ranges {
>    >       template<class Val, class CharT, class Traits>
>    >       class basic_istream_view<Val, CharT, Traits>::iterator { // exposition only
>    >       public:
>    >         using iterator_category = input_iterator_tag;
>    >         using difference_type = ptrdiff_t;
>    >         using value_type = Val;
>    >         using reference = Val&;

>    >         iterator() = default;
>    >         […]
>    >       };
>    >     }

[2020-02-13, Prague]

LWG decided for NAD: The `ranges::basic_istream_view::iterator` is a move-only type and thus cannot meet the Cpp17 requirements (even `output_iterator_tag`), as such it should not specialize `iterator_traits`, to avoid misleading results when it is passed to new algorithms.

A related issue, LWG 3397, is supposed to take care for a problem with the definition of the `iterator_category` member type of this template.

[2020-11-09 Status changed: Tentatively NAD → NAD.]

Proposed resolution: