C++ unseq执行策略是否需要迭代器';值\u类型是否可分配?

C++ unseq执行策略是否需要迭代器';值\u类型是否可分配?,c++,c++17,stl-algorithm,C++,C++17,Stl Algorithm,以下被剪断的文件不使用GCC 10()编译: 我在CPP参考资料或中都找不到这样的要求。C++的标准不要求传递给并行算法的序列的值是可分配的(也不可复制的构造,也不是默认构造的),除非非并行对应的要求。不接受此类值的实现是不一致的 [algorithms.parallel.defns]/2并行算法通过调用以下函数来访问通过其参数间接访问的对象: … (2.2)-对其规范要求的序列元素的操作。 这意味着算法对值类型的要求不应超过必需的范围 有时允许并行算法复制元素: [algorithms.pa

以下被剪断的文件不使用GCC 10()编译:


我在CPP参考资料或中都找不到这样的要求。C++的标准不要求传递给并行算法的序列的值是可分配的(也不可复制的构造,也不是默认构造的),除非非并行对应的要求。不接受此类值的实现是不一致的

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

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

这意味着算法对值类型的要求不应超过必需的范围

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

[algorithms.parallel.exec]/2除非另有说明,否则实现可以从序列中任意复制元素(类型为
T
),其中
是可构造的,而
是可破坏的


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

看起来像是
g++
中的一个bug
clang++
对此没有问题,我也不明白为什么会有问题。@TedLyngmo奇怪的是,即使使用
-stdlib=libstdc++
,clang也会接受它……你的推理是不是错了?错误消息表明问题不在于
T
不是默认可构造的,而在于它是不可赋值的。@PilarLatiesa AFAIK,libstdc++还没有自己的并行算法实现。它使用Intel TBB作为后端,至少使用GCC。当与Clang一起使用时,它可能会退回到设置中的串行后端(例如,请参阅)@DanielLangr如果没有人发布答案,我将在几天内提交PR。
#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;
}
 error: use of deleted function 'T& T::operator=(const T&)'
  643 |                 __min_val = __obj.__min_val;
      |                 ~~~~~~~~~~^~~~~~~~~~~~~~~~~