为什么不能交换 std::<T>atomic?


#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::atomicswap,所以它本身就是原子(。

总而言之,如果你不需要原子swap,使用提到的exchanges可以很容易地完成。

相关内容

  • 没有找到相关文章

最新更新