namespace std {
template<class T> struct atomic_ref<T*> {
private:
T** ptr; // *exposition only*
public:
using value_type = T*;
using difference_type = ptrdiff_t;
static constexpr size_t required_alignment = *implementation-defined*;
static constexpr bool is_always_lock_free = *implementation-defined*;
bool is_lock_free() const noexcept;
explicit atomic_ref(T*&);
atomic_ref(const atomic_ref&) noexcept;
atomic_ref& operator=(const atomic_ref&) = delete;
void store(T*, memory_order = memory_order::seq_cst) const noexcept;
T* operator=(T*) const noexcept;
T* load(memory_order = memory_order::seq_cst) const noexcept;
operator T*() const noexcept;
T* exchange(T*, memory_order = memory_order::seq_cst) const noexcept;
bool compare_exchange_weak(T*&, T*,
memory_order, memory_order) const noexcept;
bool compare_exchange_strong(T*&, T*,
memory_order, memory_order) const noexcept;
bool compare_exchange_weak(T*&, T*,
memory_order = memory_order::seq_cst) const noexcept;
bool compare_exchange_strong(T*&, T*,
memory_order = memory_order::seq_cst) const noexcept;
T* fetch_add(difference_type, memory_order = memory_order::seq_cst) const noexcept;
T* fetch_sub(difference_type, memory_order = memory_order::seq_cst) const noexcept;
T* fetch_max(T*, memory_order = memory_order::seq_cst) const noexcept;
T* fetch_min(T*, memory_order = memory_order::seq_cst) const noexcept;
T* operator++(int) const noexcept;
T* operator--(int) const noexcept;
T* operator++() const noexcept;
T* operator--() const noexcept;
T* operator+=(difference_type) const noexcept;
T* operator-=(difference_type) const noexcept;
void wait(T*, memory_order = memory_order::seq_cst) const noexcept;
void notify_one() const noexcept;
void notify_all() const noexcept;
};
}

`T* fetch_`*key*(difference_type operand, memory_order order = memory_order::seq_cst) const noexcept;

Memory is affected according to the value of order.

These operations are atomic read-modify-write operations ([intro.races]).

For fetch_max and fetch_min, the maximum and minimum
computation is performed as if by max and min
algorithms ([alg.min.max]), respectively, with the object value and the first
parameter as the arguments.

[*Note 1*: *end note*]

If the pointers point to different complete objects (or subobjects thereof),
the < operator does not establish a strict weak ordering
(Table 29, [expr.rel]).

â€” `T* operator `*op*=(difference_type operand) const noexcept;