#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::原子&("时没有匹配的函数
为什么std::atomic<T>
不能交换
std::atomic
有一个已删除的复制构造函数,并且没有移动构造函数。
因此,它既不是移动可赋值,也不是移动可构造。
因此,不能对任何std::atomic
类型调用std::swap
。
参考:
https://en.cppreference.com/w/cpp/algorithm/swap
这个问题有两个层次。
首先是简单而技术性的——std::atomic
不像其他答案中提到的那样是可移动的或可移动的。
其次是这种交换std::atomic
本身不是原子的基本原理。由于std::atomic
在多线程环境中使用,添加swap
会由于可能的误解而导致广泛的错误(因为std::atomic
有swap
,所以它本身就是原子(。
总而言之,如果你不需要原子swap
,使用提到的exchange
s可以很容易地完成。