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.10 [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.