33 Concurrency support library [thread]
namespace std {
template<class T, class D = default_delete<T>>
class hazard_pointer_obj_base {
public:
void retire(D d = D()) noexcept;
protected:
hazard_pointer_obj_base() = default;
hazard_pointer_obj_base(const hazard_pointer_obj_base&) = default;
hazard_pointer_obj_base(hazard_pointer_obj_base&&) = default;
hazard_pointer_obj_base& operator=(const hazard_pointer_obj_base&) = default;
hazard_pointer_obj_base& operator=(hazard_pointer_obj_base&&) = default;
~hazard_pointer_obj_base() = default;
private:
D deleter;
};
}
D shall be a function object type (
[func.require])
for which, given a value
d of type
D and
a value
ptr of type
T*,
the expression
d(ptr) is valid
. The behavior of a program
that adds specializations for
hazard_pointer_obj_base is undefined
.D shall meet the requirements for
Cpp17DefaultConstructible and
Cpp17MoveAssignable. T may be an incomplete type
. It shall be complete before any member
of the resulting specialization of
hazard_pointer_obj_base
is referenced
.void retire(D d = D()) noexcept;
Mandates:
T is a hazard-protectable type
. Preconditions:
*this is
a base class subobject of an object
x of type
T. Move-assigning
d to
deleter does not exit via an exception
.Effects: Move-assigns
d to
deleter,
thereby setting it as the deleter of
x,
then retires
x. May reclaim possibly-reclaimable objects
.