33 Concurrency support library [thread]
namespace std {
  class hazard_pointer {
  public:
    hazard_pointer() noexcept;
    hazard_pointer(hazard_pointer&&) noexcept;
    hazard_pointer& operator=(hazard_pointer&&) noexcept;
    ~hazard_pointer();
    [[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&) noexcept;
  };
}
An object of type 
hazard_pointer is either empty or
owns a hazard pointer
.Each hazard pointer is owned by
exactly one object of type 
hazard_pointer.[
Note 1: 
An empty 
hazard_pointer object is different from
a 
hazard_pointer object
that owns an unassociated hazard pointer
.An empty 
hazard_pointer object does not own any hazard pointers
. — 
end note]