C++ unseq执行策略是否需要迭代器';值\u类型是否可分配?
以下被剪断的文件不使用GCC 10()编译: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
我在CPP参考资料或中都找不到这样的要求。C++的标准不要求传递给并行算法的序列的值是可分配的(也不可复制的构造,也不是默认构造的),除非非并行对应的要求。不接受此类值的实现是不一致的 [algorithms.parallel.defns]/2并行算法通过调用以下函数来访问通过其参数间接访问的对象:
…
(2.2)-对其规范要求的序列元素的操作。
这意味着算法对值类型的要求不应超过必需的范围 有时允许并行算法复制元素: [algorithms.parallel.exec]/2除非另有说明,否则实现可以从序列中任意复制元素(类型为
T
),其中是可构造的,而是可破坏的
但仅适用于那些可以复制构造的元素,然后是通过复制构造函数,而不是通过赋值。看起来像是g++
中的一个bugclang++
对此没有问题,我也不明白为什么会有问题。@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;
| ~~~~~~~~~~^~~~~~~~~~~~~~~~~