簡體   English   中英

unseq 執行策略是否要求迭代器的 value_type 為 Cpp17CopyAssignable?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM