3385. common_iterator is not sufficiently constrained for non-copyable iterators

Section: 24.5.5.1 [common.iterator] Status: C++20 Submitter: Corentin Jabot Opened: 2020-01-31 Last modified: 2021-02-25

Priority: 0

View other active issues in [common.iterator].

View all other issues in [common.iterator].

View all issues with C++20 status.

Discussion:

We don't actually specify anywhere that non-copyable iterators do not have a common_iterator (and it would make little sense for them to as algorithms dealing with C++17 iterators are not expecting non-copyable things) As it stands common_iterator can be created from move only iterator but are then non-copyable themselves. P1862 already constrains common_view in a similar fashion

[2020-02 Prioritized as IMMEDIATE Monday morning in Prague]

Proposed resolution:

This wording is relative to N4849.

  1. Modify 24.2 [iterator.synopsis], header <iterator> synopsis, as indicated:

    namespace std {
      […]
      // 24.5.5 [iterators.common], common iterators
      template<input_or_output_iterator I, sentinel_for<I> S>
        requires (!same_as<I, S> && copyable<I>)
          class common_iterator;
      […]
    }
    
  2. Modify 24.5.5.1 [common.iterator], class template common_iterator synopsis, as indicated:

    namespace std {
      template<input_or_output_iterator I, sentinel_for<I> S>
        requires (!same_as<I, S> && copyable<I>)
      class common_iterator {
      public:
        […]
      };
      […]
    }