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.

4253. basic_const_iterator should provide iterator_type

Section: 24.5.3.3 [const.iterators.iterator] Status: New Submitter: Hewill Kang Opened: 2025-04-29 Last modified: 2025-05-04

Priority: Not Prioritized

View other active issues in [const.iterators.iterator].

View all other issues in [const.iterators.iterator].

View all issues with New status.

Discussion:

Currently, iterator adaptors in <iterator> that wrap a single iterator such as reverse_iterator, move_iterator, and counted_iterator all provide a public iterator_type member for users to access the underlying iterator type, except for basic_const_iterator (demo):

#include <iterator>

using I  = int*;
using RI = std::reverse_iterator<I>;
using MI = std::move_iterator<I>;
using CI = std::counted_iterator<I>;
using BI = std::basic_const_iterator<I>;

static_assert(std::same_as<RI::iterator_type, I>);
static_assert(std::same_as<MI::iterator_type, I>);
static_assert(std::same_as<CI::iterator_type, I>);
static_assert(std::same_as<BI::iterator_type, I>); // error

It seems reasonable to add one for basic_const_iterator for consistency.

Proposed resolution:

This wording is relative to N5008.

  1. Modify 24.5.3.3 [const.iterators.iterator] as indicated:

    namespace std {
      […]
      template<input_iterator Iterator>
      class basic_const_iterator {
        Iterator current_ = Iterator();                             // exposition only
        using reference = iter_const_reference_t<Iterator>;         // exposition only
        using rvalue-reference =                                    // exposition only
          iter-const-rvalue-reference-t<Iterator>;
              
        public:
          using iterator_type = I;
          using iterator_concept = see below;
          using iterator_category = see below;  // not always present
          using value_type = iter_value_t<Iterator>;
          using difference_type = iter_difference_t<Iterator>;
          […]
      };
    }