以下剪辑不能使用 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] 删除。
我来说两句