unseq 执行策略是否要求迭代器value_type是 Cpp17CopyAssignable?



下面的代码片段不能在GCC 10中编译(编译器资源管理器链接):

#include <vector>
#include <algorithm>
#include <execution>
struct T
{
int const ID; // Not Cpp17CopyAssignable
};
int f(std::vector<T> const &v)
{
if (v.empty()) return -1;

return std::min_element(std::execution::par_unseq, v.begin(), v.end(),
[](T const &lhs, T const &rhs) { return lhs.ID < rhs.ID; })->ID;
}

因为TCpp17CopyAssignable:

error: use of deleted function 'T& T::operator=(const T&)'
643 |                 __min_val = __obj.__min_val;
|                 ~~~~~~~~~~^~~~~~~~~~~~~~~~~

我在cppreference或[algorithms]中找不到这样的要求。我错过了吗?

c++标准不要求传递给并行算法的序列的值是可赋值的(也不是可复制构造的,也不是默认构造的),除非非并行对等体要求。不接受这些值的实现是不符合标准的。

[algorithms.parallel.defns]/2并行算法通过调用以下函数来间接访问可通过其参数访问的对象:

(2.2) -按规范要求对序列元素进行的操作。


这表示算法不应该从值类型中要求超过必要的值。

有时允许并行算法复制元素:

[algorithms.parallel.exec]/2除非另有说明,实现可以从is_trivially_copy_constructible_v<T>is_trivially_destructible_v<T>为真的序列中任意复制元素(类型为T)。

但只适用于那些可简单复制构造的元素,并且是通过复制构造函数,而不是通过赋值。

最新更新