3832. Missing change for element_view::iterator in LWG 3798

Section: 25.7.23.3 [range.elements.iterator] Status: New Submitter: Jiang An Opened: 2022-11-23 Last modified: 2024-07-21

Priority: 3

View other active issues in [range.elements.iterator].

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.

  1. Modify 25.7.23.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.

    1. (2.1) — If std::get<N>(*current_) is an prvalue, iterator_category denotes input_iterator_tag.

    2. (2.2) — Otherwise, if C models derived_from<random_access_iterator_tag>, iterator_category denotes random_access_iterator_tag.

    3. (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.

Previous resolution [SUPERSEDED]:

This wording is relative to N4928.

  1. Modify 25.7.23.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.

    1. (2.1) — If range_reference_t<Base> is a reference type and std::get<N>(*current_) is an prvalue 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.2) — Otherwise, if C models derived_from<random_access_iterator_tag>, iterator_category denotes random_access_iterator_tag.

    3. (2.3) — Otherwise, iterator_category denotes C.

[2024-07-08; Hewill Kang provides improved wording]

Proposed resolution:

This wording is relative to N4986.

  1. Modify 25.7.23.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.

    1. (2.1) — If std::get<N>(*current_)is_reference_v<decltype(get-element(current_))> is an rvaluefalse, iterator_category denotes input_iterator_tag.

    2. (2.2) — Otherwise, if C models derived_from<random_access_iterator_tag>, iterator_category denotes random_access_iterator_tag.

    3. (2.3) — Otherwise, iterator_category denotes C.