Могу ли я использовать нетривиально копируемый итератор в параллельной версии std :: find_if? - PullRequest
2 голосов
/ 19 апреля 2020

У меня есть простой код, который просто находит любой делитель моего собственного типа BigInt, который имеет собственный итератор произвольного доступа:

  BigIntRangeIterator range(2, x);
  auto i = std::find_if(std::execution::par, range.begin(), range.end()
              , [&](auto y) {return x % y == 0;}
  );

Мой итератор содержит std::vector, поэтому его нетривиально копировать , Когда я пытаюсь скомпилировать этот код, я получаю сообщение об ошибке std::atomic:

/usr/include/c++/9/atomic:191: error: static assertion failed: std::atomic requires a trivially copyable type
  191 |       static_assert(__is_trivially_copyable(_Tp),
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

Означает ли это, что в параллельной версии функции std::find_if можно использовать только тривиально копируемые итераторы?

1 Ответ

1 голос
/ 19 апреля 2020

Да, необходимо использовать std::atomic, чтобы избежать гонки данных, в то время как основной шаблон std::atomic требует, чтобы класс был тривиально копируемым.

https://en.cppreference.com/w/cpp/atomic/atomic#Primary_template

...