为什么std::atomic_fetch的入参是指针

Why does std::atomic_fetch take a pointer as its input parameter

std::atomic_fetch_xxx(or, and, add, sub, xor)的一组自由函数,以一个std::atomic<T>*命名的obj作为输入:

template< class T >
T atomic_fetch_sub(std::atomic<T>* obj,
                   typename std::atomic<T>::difference_type arg ) noexcept;

问题:为什么 std::atomic 类型被当作指针而不是作为引用传入 例如:

T atomic_fetch_sub(std::atomic<T>& obj,
                   typename std::atomic<T>::difference_type arg ) noexcept;

有实用的rational/reason还是单纯的文体?

Why does std::atomic_fetch take a pointer as its input parameter

atomic_fetch_sub 需要能够更新第一个参数的值(以防失败),这需要第一个参数通过指针或引用传递。

选择了一个指针使其与 C 接口兼容。

这些免费函数的存在是为了让应用程序能够在不更改大部分代码的情况下编译为 C 或 C++。通过使用指针,调用自由函数看起来像 atomic_fetch_add(var, ...)。这也是 atomic_int 存在于 C++ 中的原因,尽管它的定义与 C 版本不同。

C11通过使用generic selection macros. atomic_fetch_add in C实现这种函数重载不是函数;它是一个宏,根据其中一个参数的类型选择要调用的函数。

拥有自由函数的整个想法是与 C 兼容。您可以很容易地将 C 代码导入 C++ 并使其在那里工作相同(反之亦然) ).

如果您不想这样,您可以改用成员函数 - 在任何地方都使用引用 - 例如 obj.fetch_sub(arg),甚至 obj -= arg 使用运算符重载。

但是代码将只有 C++。