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