Как создать std :: pair, содержащий std :: atomic? - PullRequest
6 голосов
/ 21 марта 2019

Я не могу понять, как создать следующее:

std::pair<std::atomic<bool>, int>

Я всегда получаю

/ usr / include / c ++ / 5.5.0 / bits / stl_pair.h: 139: 45: ошибка: использование удаленной функции 'std :: atomic :: atomic (const std :: atomic &)'
: первая (__x), вторая (std :: forward <_U2> (__y)) {}

Я пробовал

std::pair<std::atomic<bool>, int> pair = std::make_pair(true, 1); //doesn't work
std::pair<std::atomic<bool>, int> pair = std::make_pair({true}, 1); //doesn't work
std::pair<std::atomic<bool>, int> pair = std::make_pair(std::atomic<bool>(true), 1); //doesn't work
std::pair<std::atomic<bool>, int> pair = std::make_pair(std::move(std::atomic<bool>(true)), 1); //doesn't work

Я знаю, что std :: atomic не подлежит копированию, так как вы должны создать его в паре? Разве это просто невозможно?

1 Ответ

7 голосов
/ 21 марта 2019

Вы можете сделать:

std::pair<std::atomic<bool>, int> p(true, 1);

При этом используется true для инициализации атомарного первого члена без каких-либо посторонних копий или перемещений.В C ++ 17 гарантированное разрешение копирования также позволяет писать:

auto p = std::pair<std::atomic<bool>, int>(true, 1);
...