[unique.ptr.single] (original) (raw)

20 Memory management library [mem]

20.3 Smart pointers [smartptr]

20.3.1 Unique-ownership pointers [unique.ptr]

20.3.1.3 unique_ptr for single objects [unique.ptr.single]

20.3.1.3.1 General [unique.ptr.single.general]

namespace std { template<class T, class D = default_delete<T>> class unique_ptr { public: using pointer = see below;using element_type = T;using deleter_type = D;constexpr unique_ptr() noexcept;constexpr explicit unique_ptr(type_identity_t<pointer> p) noexcept;constexpr unique_ptr(type_identity_t<pointer> p, see below d1) noexcept;constexpr unique_ptr(type_identity_t<pointer> p, see below d2) noexcept;constexpr unique_ptr(unique_ptr&& u) noexcept;constexpr unique_ptr(nullptr_t) noexcept;template<class U, class E> constexpr unique_ptr(unique_ptr<U, E>&& u) noexcept;constexpr ~unique_ptr();constexpr unique_ptr& operator=(unique_ptr&& u) noexcept;template<class U, class E> constexpr unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;constexpr unique_ptr& operator=(nullptr_t) noexcept;constexpr add_lvalue_reference_t<T> operator*() const noexcept(see below);constexpr pointer operator->() const noexcept;constexpr pointer get() const noexcept;constexpr deleter_type& get_deleter() noexcept;constexpr const deleter_type& get_deleter() const noexcept;constexpr explicit operator bool() const noexcept;constexpr pointer release() noexcept;constexpr void reset(pointer p = pointer()) noexcept;constexpr void swap(unique_ptr& u) noexcept; unique_ptr(const unique_ptr&) = delete; unique_ptr& operator=(const unique_ptr&) = delete;};}

A program that instantiates the definition of unique_ptr<T, D>is ill-formed if T* is an invalid type.

[Note 1:

This prevents the instantiation of specializations such asunique_ptr<T&, D> and unique_ptr<int() const, D>.

— _end note_]

The default type for the template parameter D isdefault_delete.

A client-supplied template argumentD shall be a function object type ([function.objects]), lvalue reference to function, or lvalue reference to function object type for which, given a value d of type D and a valueptr of type unique_ptr<T, D>​::​pointer, the expressiond(ptr) is valid and has the effect of disposing of the pointer as appropriate for that deleter.

If the deleter's type D is not a reference type, D shall meet the Cpp17Destructible requirements (Table 35).

If the qualified-id remove_reference_t<D>​::​pointer is valid and denotes a type ([temp.deduct]), then unique_ptr<T, D>​::​pointer shall be a synonym for remove_reference_t<D>​::​pointer.

Otherwiseunique_ptr<T, D>​::​pointer shall be a synonym for element_type*.

The type unique_ptr<T, D>​::​pointer shall meet the Cpp17NullablePointer requirements (Table 36).

[Example 1:

Given an allocator type X ([allocator.requirements.general]) and letting A be a synonym for allocator_traits<X>, the types A​::​pointer,A​::​const_pointer, A​::​void_pointer, and A​::​const_void_pointermay be used as unique_ptr<T, D>​::​pointer.

— _end example_]

20.3.1.3.2 Constructors [unique.ptr.single.ctor]

constexpr unique_ptr() noexcept;constexpr unique_ptr(nullptr_t) noexcept;

Constraints: is_pointer_v<deleter_type> is false andis_default_constructible_v<deleter_type> is true.

Effects: Constructs a unique_ptr object that owns nothing, value-initializing the stored pointer and the stored deleter.

Postconditions: get() == nullptr.

get_deleter()returns a reference to the stored deleter.

constexpr explicit unique_ptr(type_identity_t<pointer> p) noexcept;

Constraints: is_pointer_v<deleter_type> is false andis_default_constructible_v<deleter_type> is true.

Effects: Constructs a unique_ptr which ownsp, initializing the stored pointer with p and value-initializing the stored deleter.

Postconditions: get() == p.

get_deleter()returns a reference to the stored deleter.

constexpr unique_ptr(type_identity_t<pointer> p, const D& d) noexcept;constexpr unique_ptr(type_identity_t<pointer> p, remove_reference_t<D>&& d) noexcept;

Constraints: is_constructible_v<D, decltype(d)> is true.

Preconditions: For the first constructor, if D is not a reference type,D meets the Cpp17CopyConstructible requirements and such construction does not exit via an exception.

For the second constructor, if D is not a reference type,D meets the Cpp17MoveConstructible requirements and such construction does not exit via an exception.

Effects: Constructs a unique_ptr object which owns p, initializing the stored pointer with p and initializing the deleter from std​::​forward<decltype(d)>(d).

Postconditions: get() == p.

get_deleter() returns a reference to the stored deleter.

If D is a reference type then get_deleter()returns a reference to the lvalue d.

Remarks: If D is a reference type, the second constructor is defined as deleted.

[Example 1: D d; unique_ptr<int, D> p1(new int, D()); unique_ptr<int, D> p2(new int, d); unique_ptr<int, D&> p3(new int, d); unique_ptr<int, const D&> p4(new int, D()); — _end example_]

constexpr unique_ptr(unique_ptr&& u) noexcept;

Constraints: is_move_constructible_v<D> is true.

Preconditions: If D is not a reference type,D meets the Cpp17MoveConstructiblerequirements (Table 31).

Construction of the deleter from an rvalue of type D does not throw an exception.

Effects: Constructs a unique_ptr fromu.

If D is a reference type, this deleter is copy constructed from u's deleter; otherwise, this deleter is move constructed from u's deleter.

[Note 1:

The construction of the deleter can be implemented with std​::​forward<D>.

— _end note_]

Postconditions: get() yields the value u.get()yielded before the construction.

u.get() == nullptr.

get_deleter() returns a reference to the stored deleter that was constructed fromu.get_deleter().

If D is a reference type thenget_deleter() and u.get_deleter() both reference the same lvalue deleter.

template<class U, class E> constexpr unique_ptr(unique_ptr<U, E>&& u) noexcept;

Constraints:

Preconditions: If E is not a reference type, construction of the deleter from an rvalue of type Eis well-formed and does not throw an exception.

Otherwise, E is a reference type and construction of the deleter from an lvalue of type Eis well-formed and does not throw an exception.

Effects: Constructs a unique_ptr from u.

If E is a reference type, this deleter is copy constructed fromu's deleter; otherwise, this deleter is move constructed from u's deleter.

[Note 2:

The deleter constructor can be implemented withstd​::​forward<E>.

— _end note_]

Postconditions: get() yields the value u.get()yielded before the construction.

u.get() == nullptr.

get_deleter() returns a reference to the stored deleter that was constructed fromu.get_deleter().

20.3.1.3.3 Destructor [unique.ptr.single.dtor]

Effects: Equivalent to:if (get()) get_deleter()(get());

[Note 1:

The use of default_delete requires T to be a complete type.

— _end note_]

Remarks: The behavior is undefined if the evaluation of get_deleter()(get()) throws an exception.

20.3.1.3.4 Assignment [unique.ptr.single.asgn]

constexpr unique_ptr& operator=(unique_ptr&& u) noexcept;

Constraints: is_move_assignable_v<D> is true.

Preconditions: If D is not a reference type, D meets theCpp17MoveAssignable requirements (Table 33) and assignment of the deleter from an rvalue of type D does not throw an exception.

Otherwise, D is a reference type;remove_reference_t<D> meets the Cpp17CopyAssignablerequirements and assignment of the deleter from an lvalue of type D does not throw an exception.

Effects: Calls reset(u.release()) followed byget_deleter() = std​::​forward<D>(u.get_deleter()).

Postconditions: If this != addressof(u),u.get() == nullptr, otherwise u.get() is unchanged.

template<class U, class E> constexpr unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;

Constraints:

Preconditions: If E is not a reference type, assignment of the deleter from an rvalue of type Eis well-formed and does not throw an exception.

Otherwise, E is a reference type and assignment of the deleter from an lvalue of type Eis well-formed and does not throw an exception.

Effects: Calls reset(u.release()) followed byget_deleter() = std​::​forward<E>(u.get_deleter()).

Postconditions: u.get() == nullptr.

constexpr unique_ptr& operator=(nullptr_t) noexcept;

Effects: As if by reset().

Postconditions: get() == nullptr.

20.3.1.3.5 Observers [unique.ptr.single.observers]

constexpr add_lvalue_reference_t<T> operator*() const noexcept(noexcept(*declval<pointer>()));

Mandates: reference_converts_from_temporary_v<add_lvalue_reference_t<T>, decltype(
*declval<pointer>())> is false.

Preconditions: get() != nullptr is true.

constexpr pointer operator->() const noexcept;

Preconditions: get() != nullptr.

[Note 1:

The use of this function typically requires that T be a complete type.

— _end note_]

constexpr pointer get() const noexcept;

Returns: The stored pointer.

constexpr deleter_type& get_deleter() noexcept;constexpr const deleter_type& get_deleter() const noexcept;

Returns: A reference to the stored deleter.

constexpr explicit operator bool() const noexcept;

Returns: get() != nullptr.

20.3.1.3.6 Modifiers [unique.ptr.single.modifiers]

constexpr pointer release() noexcept;

Postconditions: get() == nullptr.

Returns: The value get() had at the start of the call to release.

constexpr void reset(pointer p = pointer()) noexcept;

Effects: Assigns p to the stored pointer, and then, with the old value of the stored pointer, old_p, evaluates if (old_p) get_deleter()(old_p);

[Note 1:

The order of these operations is significant because the call to get_deleter() might destroy *this.

— _end note_]

Postconditions: get() == p.

[Note 2:

The postcondition does not hold if the call to get_deleter()destroys *this since this->get() is no longer a valid expression.

— _end note_]

Remarks: The behavior is undefined if the evaluation of get_deleter()(old_p) throws an exception.

constexpr void swap(unique_ptr& u) noexcept;

Effects: Invokes swap on the stored pointers and on the stored deleters of *this and u.