![](/img/trans.png)
[英]Iterators with complex value type: confusion with value_type and reference
[英]Do the unseq execution policy require the iterators' value_type to be 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並行算法通過調用以下函數訪問通過其 arguments 間接訪問的對象:
...
(2.2) — 對其規范要求的那些序列元素的操作。
...
這表示算法不應要求值類型超出必要的范圍。
有時允許並行算法復制元素:
[algorithms.parallel.exec]/2除非另有說明,否則實現可以從
is_trivially_copy_constructible_v<T>
和is_trivially_destructible_v<T>
為真的序列中制作元素的任意副本(類型為T
)。
但僅適用於那些可以簡單復制構造的元素,然后是復制構造函數,而不是賦值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.