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

3552. Parallel specialized memory algorithms should require forward iterators

Section: 20.2.2 [memory.syn] Status: WP Submitter: Tim Song Opened: 2021-05-16 Last modified: 2021-06-07

Priority: Not Prioritized

View all other issues in [memory.syn].

View all issues with WP status.

Discussion:

The parallel versions of uninitialized_{copy,move}{,_n} are currently depicted as accepting input iterators for their source range. Similar to the non-uninitialized versions, they should require the source range to be at least forward.

[2021-05-20; Reflector poll]

Set status to Tentatively Ready after six votes in favour during reflector poll.

[2021-06-07 Approved at June 2021 virtual plenary. Status changed: Voting → WP.]

Proposed resolution:

This wording is relative to N4885.

  1. Modify 20.2.2 [memory.syn], header <memory> synopsis, as indicated:

      […]
    namespace std {
      […]
    
      template<class InputIterator, class NoThrowForwardIterator>
        NoThrowForwardIterator uninitialized_copy(InputIterator first, InputIterator last,
                                                  NoThrowForwardIterator result);
      template<class ExecutionPolicy, class InputForwardIterator, class NoThrowForwardIterator>
        NoThrowForwardIterator uninitialized_copy(ExecutionPolicy&& exec, // see 27.3.5 [algorithms.parallel.overloads]
                                                  InputForwardIterator first, InputForwardIterator last,
                                                  NoThrowForwardIterator result);
      template<class InputIterator, class Size, class NoThrowForwardIterator>
        NoThrowForwardIterator uninitialized_copy_n(InputIterator first, Size n,
                                                    NoThrowForwardIterator result);
      template<class ExecutionPolicy, class InputForwardIterator, class Size, class NoThrowForwardIterator>
        NoThrowForwardIterator uninitialized_copy_n(ExecutionPolicy&& exec, // see 27.3.5 [algorithms.parallel.overloads]
                                                    InputForwardIterator first, Size n,
                                                    NoThrowForwardIterator result);  
      […]
    
      template<class InputIterator, class NoThrowForwardIterator>
        NoThrowForwardIterator uninitialized_move(InputIterator first, InputIterator last,
                                                  NoThrowForwardIterator result);
      template<class ExecutionPolicy, class InputForwardIterator, class NoThrowForwardIterator>
        NoThrowForwardIterator uninitialized_move(ExecutionPolicy&& exec, // see 27.3.5 [algorithms.parallel.overloads]
                                                  InputForwardIterator first, InputForwardIterator last,
                                                  NoThrowForwardIterator result);
      template<class InputIterator, class Size, class NoThrowForwardIterator>
        pair<InputIterator, NoThrowForwardIterator>
          uninitialized_move_n(InputIterator first, Size n, NoThrowForwardIterator result);
      template<class ExecutionPolicy, class InputForwardIterator, class Size, class NoThrowForwardIterator>
        pair<InputForwardIterator, NoThrowForwardIterator>
          uninitialized_move_n(ExecutionPolicy&& exec, // see 27.3.5 [algorithms.parallel.overloads]
                               InputForwardIterator first, Size n, NoThrowForwardIterator result);
    
      […]
    }