This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of New status.
Section: 26.7.22.3 [range.elements.iterator] Status: New Submitter: Jiang An Opened: 2022-11-23 Last modified: 2023-01-28
Priority: 3
View all other issues in [range.elements.iterator].
View all issues with New status.
Discussion:
In LWG 3798 (voted into WP in November 2022), iterator types of several range adaptors may have forward_iterator_tag or stronger iterator tag types as their iterator_category type when their operator* returns rvalue references. However, the proposed resolution missed the similar change for element_view::iterator.
[2022-11-30; Reflector poll]
Set priority to 3 after reflector poll.
"The proposed resolution is incorrect - just because the get expression is an xvalue doesn't mean operator* returns by reference."
Previous resolution [SUPERSEDED]:
This wording is relative to N4917.
Modify 26.7.22.3 [range.elements.iterator] as indicated:
-2- The member typedef-name iterator_category is defined if and only if Base models forward_range. In that case, iterator_category is defined as follows: Let C denote the type iterator_traits<iterator_t<Base>>::iterator_category.
(2.1) — If std::get<N>(*current_) is a
nprvalue, iterator_category denotes input_iterator_tag.(2.2) — Otherwise, if C models derived_from<random_access_iterator_tag>, iterator_category denotes random_access_iterator_tag.
(2.3) — Otherwise, iterator_category denotes C.
[2023-01-22; Jiang An comments and provides improved wording]
The old proposed resolution was incorrect. I think the correct criteria could be that determined from the return type of get-element.
Proposed resolution:
This wording is relative to N4928.
Modify 26.7.22.3 [range.elements.iterator] as indicated:
-2- The member typedef-name iterator_category is defined if and only if Base models forward_range. In that case, iterator_category is defined as follows: Let C denote the type iterator_traits<iterator_t<Base>>::iterator_category.
(2.1) — If range_reference_t<Base> is a reference type and std::get<N>(*current_) is a
nprvalue or neither range_reference_t<Base> nor tuple_element_t<N, range_reference_t<Base> is a reference type, iterator_category denotes input_iterator_tag.(2.2) — Otherwise, if C models derived_from<random_access_iterator_tag>, iterator_category denotes random_access_iterator_tag.
(2.3) — Otherwise, iterator_category denotes C.