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;
}

因为T不是Cpp17CopyAssignable

 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除非另有说明,否则实现可以T从其中is_trivially_copy_constructible_v<T>is_trivially_destructible_v<T>为真的序列中制作元素(类型为)的任意副本

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

引用绑定到类型为'value_type'的空指针

什么时候使用迭代器的“ value_type”?

STL 迭代器继承:“value_type”未命名类型

为什么即使T的value_type为const,std :: is_const :: value还是'false'?

如何只允许具有ceratin value_type的迭代器?

具有复杂值类型的迭代器:与value_type和reference混淆

模板内的 C++ value_type::second_type 编译器错误

为什么 C++ 分配器要求不要求construct() 构造value_type 的对象?

使用par_unseq时是否仍可以依赖输出元素的顺序?

使用 c++20 检查 type 是否具有某些值类型和关键字 value_type 本身

如何解决“无法使用类型为value_type(又称为Derived *)的左值初始化Base *类型的返回对象?

在模板<class It> 函數中,It 是一個迭代器,我可以讓 It::value_type 為 vector::iterators 和 array::iterators 工作嗎?

制作不存储value_type的InputIterator

检查value是否为null,如果为null,则执行额外的(子)查询

使用向量时是否为无符号int或迭代器?

如何使用 std::execution::par_unseq 线程安全?

为abstractCollection实现迭代器

错误:无法将“ const value_type”转换为“ char”

使用 value_type 在 pertect forward 中获取类型

如何使用C ++ 11 integer_constant :: value_type()

std :: atomic <X> :: value_type发生了什么?

C ++ 11从变量获取std :: map value_type

STL容器中value_type的用途是什么?

通过Container :: value_type进行模板专业化

boost multiindex:lower_bound 以 value_type 作为参数

文件系统 value_type 指向字符串的指针?

尽管将失火策略设置为“忽略”,但失火简单触发器仍在执行作业

检查value是否为JavaScript中的Symbol

检查Eval(“ VALUE”)是否为空