Почему нельзя заменить std :: atomi c<T>? - PullRequest
4 голосов
/ 07 мая 2020
#include <atomic>

int main()
{
    auto a = std::atomic_int(1);
    auto b = std::atomic_int(2);

    std::swap(a, b); // error
}

сообщение об ошибке:

ошибка: нет соответствующей функции для вызова 'swap (std :: atomic &, std :: atomic &)'

Почему нельзя поменять местами std::atomic<T>?

Ответы [ 2 ]

5 голосов
/ 07 мая 2020

std::atomic имеет удаленный конструктор копии и не имеет конструктора перемещения.

Следовательно, это не назначаемое перемещение и конструктивное перемещение .

Следовательно, std::swap не может быть вызван для любого типа std::atomic.

Ссылка:

https://en.cppreference.com/w/cpp/algorithm/swap

4 голосов
/ 07 мая 2020

Существует два уровня этой проблемы.

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

Второй - это обоснование за этим - замена std::atomic s сама по себе не будет atomi c. И поскольку std::atomic s используются в многопоточных средах, добавление swap привело бы к широкому спектру ошибок из-за возможных недоразумений (поскольку существует swap для std::atomic, то это atomi c сам по себе).

В общем - если вам не нужна atomi c swap, это довольно легко сделать, используя упомянутые exchange s.

...