This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of NAD Concepts status.

1028. raw_storage_iterator needs to be a concept-constrained template

Section: 99 [depr.storage.iterator] Status: NAD Concepts Submitter: Alisdair Meredith Opened: 2009-03-11 Last modified: 2017-06-15

Priority: Not Prioritized

View all other issues in [depr.storage.iterator].

View all issues with NAD Concepts status.

Discussion:

Addresses UK 214 [CD1]

raw_storage_iterator needs constraining as an iterator adaptor to be safely used in constrained templates

[ Summit: ]

We look forward to a paper on this topic. We recommend no action until a paper is available.

[ Post Summit Alisdair provided wording and rationale. ]

Proposed resolution:

20.2 [memory] p2

Update the synopsis for <memory>

// 20.7.8, raw storage iterator:
template <class ForwardIterator OutputIterator, class ObjectType T> 
  requires OutputIterator< OutIter, T >
    class raw_storage_iterator;

template <ForwardIterator OutIter, ObjectType T> 
  requires OutputIterator< OutIter, T >
  concept_map Iterator<raw_storage_iterator< OutIter, T > > { }

[storage.iterator] p1

Replace class template definition with:

namespace std { 
  template <class ForwardIterator OutputIterator, class ObjectType T> 
    requires OutputIterator< OutIter, T >
  class raw_storage_iterator 
    : public iterator<output_iterator_tag,void,void,void,void> { 
  public: 
    explicit raw_storage_iterator(OutputIterator x); 

    raw_storage_iterator<OutputIterator,T>& operator*(); 
    raw_storage_iterator<OutputIterator,T>& operator=(const T& element); 
    raw_storage_iterator<OutputIterator,T>& operator++(); 
    raw_storage_iterator<OutputIterator,T> operator++(int); 
  }; 

  template <ForwardIterator OutIter, ObjectType T> 
    requires OutputIterator< OutIter, T >
    concept_map Iterator<raw_storage_iterator< OutIter, T > > { }
}

Rationale:

raw_storage_iterator has to adapt a ForwardIterator, rather than just an InputIterator for two reasons:

  1. The initial iterator passed by value is expected to remain valid, pointing to the initialized region of memory.
  2. to avoid breaking the declaration of post-increment operator which would require some kind of proxy formulation to support generalised InputIterators.