std::copy
and std::move
shouldn't be in orderSection: 26.7.1 [alg.copy], 26.7.2 [alg.move] Status: C++17 Submitter: Tim Song Opened: 2016-03-23 Last modified: 2017-07-30
Priority: 0
View other active issues in [alg.copy].
View all other issues in [alg.copy].
View all issues with C++17 status.
Discussion:
26.3.5 [algorithms.parallel.overloads]/2 says that "Unless otherwise specified, the semantics of
ExecutionPolicy
algorithm overloads are identical to their overloads without."
ExecutionPolicy
overloads for std::copy
and std::move
,
so the requirement that they "start[] from first and proceed[] to last" in the original algorithm's description would
seem to apply, which defeats the whole point of adding a parallel overload.
[2016-05 Issues Telecon]
Marshall noted that all three versions of copy have subtly different wording, and suggested that they should not.
Proposed resolution:
This wording is relative to N4582.
Insert the following paragraphs after 26.7.1 [alg.copy]/4:
template<class ExecutionPolicy, class InputIterator, class OutputIterator> OutputIterator copy(ExecutionPolicy&& policy, InputIterator first, InputIterator last, OutputIterator result);-?- Requires: The ranges
-?- Effects: Copies elements in the range[first, last)
and[result, result + (last - first))
shall not overlap.[first, last)
into the range[result, result + (last - first))
. For each non-negative integern < (last - first)
, performs*(result + n) = *(first + n)
. -?- Returns:result + (last - first)
. -?- Complexity: Exactlylast - first
assignments.
Insert the following paragraphs after 26.7.2 [alg.move]/4:
template<class ExecutionPolicy, class InputIterator, class OutputIterator> OutputIterator move(ExecutionPolicy&& policy, InputIterator first, InputIterator last, OutputIterator result);-?- Requires: The ranges
-?- Effects: Moves elements in the range[first, last)
and[result, result + (last - first))
shall not overlap.[first, last)
into the range[result, result + (last - first))
. For each non-negative integern < (last - first)
, performs*(result + n) = std::move(*(first + n))
. -?- Returns:result + (last - first)
. -?- Complexity: Exactlylast - first
assignments.