std::exchange 是专门用于原子的吗?

Is std::exchange specialized for atomics?

std::exchange(x,y) 将值 y 分配给 x,将 x 的旧值分配给 returns。

此函数是否专门用于原子值,即它会使用 std::atomic_exchange 吗? 我在想答案是否定的,那么为什么不呢?有没有考虑过?我觉得是个好主意。

我正在使用它来重置一个简单的计数器,我只是想知道我是否在将来某个时候使计数器原子化以支持线程,它是否会正常工作还是不安全。

我如何编写泛型函数,它对原子类型使用原子交换,对普通类型使用普通交换?

How can I write generic function where it will use atomic exchange for atomic types and ordinary exchange for ordinary types?

可以通过检测obj.exchange(x)是否为有效表达式(对std::atomic有效)来判断是使用成员函数exchange还是自由函数std::exchange

#include <utility>
 
template<class T, class U = T>
constexpr
T my_exchange(T& obj, U&& new_value) {
  if constexpr (requires { obj.exchange(std::forward<U>(new_value)); })
    return obj.exchange(std::forward<U>(new_value));
  else
    return std::exchange(obj, std::forward<U>(new_value));
}

Demo