下面的代码片段不能在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除非另有说明,实现可以从
is_trivially_copy_constructible_v<T>
和is_trivially_destructible_v<T>
为真的序列中任意复制元素(类型为T
)。
但只适用于那些可简单复制构造的元素,并且是通过复制构造函数,而不是通过赋值。