Title
transform_view::iterator<true>::value_type and iterator_category should use const F&
Status
open
Section
[range.transform.iterator]
Submitter
Tim Song

Created on 2021-06-06.00:00:00 last changed 3 months ago

Messages

Date: 2021-06-14.14:09:34

Proposed resolution:

This wording is relative to N4885.

  1. Modify [range.transform.iterator] as indicated:

    namespace std::ranges {
      template<input_range V, copy_constructible F>
        requires view<V> && is_object_v<F> &&
                 regular_invocable<F&, range_reference_t<V>> &&
                 can-reference<invoke_result_t<F&, range_reference_t<V>>>
      template<bool Const>
      class transform_view<V, F>::iterator {
      private:
        […]
      public:
        using iterator_concept = see below;
        using iterator_category = see below; // not always present
        using value_type =
          remove_cvref_t<invoke_result_t<maybe-const<Const, F>&, 
          range_reference_t<Base>>>;
        using difference_type = range_difference_t<Base>;  
        […]
      };
    }
    

    -1- […]

    -2- The member typedef-name iterator_category is defined if and only if Base models forward_range. In that case, iterator::iterator_category is defined as follows: Let C denote the type iterator_traits<iterator_t<Base>>::iterator_category.

    1. (2.1) — If is_lvalue_reference_v<invoke_result_t<maybe-const<Const, F>&, range_reference_t<Base>>> is true, then

      1. (2.1.1) — […]

      2. (2.1.2) — […]

    2. (2.2) — Otherwise, iterator_category denotes input_iterator_tag.

Date: 2021-06-15.00:00:00

[ 2021-06-14; Reflector poll ]

Set priority to 2 after reflector poll, send to SG9 for design clarification. Should r and as_const(r) guarantee same elements?

Date: 2021-06-06.00:00:00

Iterators obtained from a const transform_view invoke the transformation function as const, but the value_type and iterator_category determination uses plain F&, i.e., non-const.

History
Date User Action Args
2021-06-14 14:09:34adminsetmessages: + msg11932
2021-06-14 14:09:34adminsetstatus: new -> open
2021-06-06 16:05:01adminsetmessages: + msg11877
2021-06-06 00:00:00admincreate