void retire(D d = D()) noexcept;
hazard_pointer() noexcept;
hazard_pointer(hazard_pointer&& other) noexcept;
~hazard_pointer();
hazard_pointer& operator=(hazard_pointer&& other) noexcept;
[[nodiscard]] bool empty() const noexcept;
template<class T> T* protect(const atomic<T*>& src) noexcept;
template<class T> bool try_protect(T*& ptr, const atomic<T*>& src) noexcept;
template<class T> void reset_protection(const T* ptr) noexcept;
void reset_protection(nullptr_t = nullptr) noexcept;
void swap(hazard_pointer& other) noexcept;
hazard_pointer make_hazard_pointer();
void swap(hazard_pointer& a, hazard_pointer& b) noexcept;