std::unique_ptr<T,Deleter>::unique_ptr
constexpr unique_ptr( std::nullptr_t ) noexcept;
unique_ptr( unique_ptr<U, E>&& u ) noexcept;
unique_ptr( std::auto_ptr <U>&& u ) noexcept;
constexpr unique_ptr( std::nullptr_t ) noexcept;
explicit unique_ptr( U p ) noexcept;
unique_ptr( U p, /* see below */ d1 ) noexcept;
unique_ptr( U p, /* see below */ d2 ) noexcept;
unique_ptr( unique_ptr<U, E>&& u ) noexcept;
std::unique_ptr that owns nothing. Value-initializes the stored pointer and the stored deleter. Requires that Deleter is DefaultConstructible and that construction does not throw an exception. These overloads participate in overload resolution only if std::is_default_constructible <Deleter>::value is true and Deleter is not a pointer type.std::unique_ptr which owns p, initializing the stored pointer with p and value-initializing the stored deleter. Requires that Deleter is DefaultConstructible and that construction does not throw an exception. This overload participates in overload resolution only if std::is_default_constructible <Deleter>::value is true and Deleter is not a pointer type.
This constructor is not selected by class template argument deduction.
(since C++17)std::unique_ptr object which owns p, initializing the stored pointer with p and initializing a deleter D as below (depends upon whether D is a reference type).D is non-reference type A, then the signatures are:
Deleter is nothrow-CopyConstructible)
D is an lvalue-reference type A&, then the signatures are:
D is an lvalue-reference type const A&, then the signatures are:
These two constructors are not selected by class template argument deduction.
(since C++17)-
Uis the same type aspointer, or -
Uis std::nullptr_t , or -
pointeris the same type aselement_type*andUis some pointer typeV*such thatV(*)[]is implicitly convertible toelement_type(*)[].
unique_ptr by transferring ownership from u to *this and stores the null pointer in u. This constructor only participates in overload resolution if std::is_move_constructible <Deleter>::value is true. If Deleter is not a reference type, requires that it is nothrow-MoveConstructible (if Deleter is a reference, get_deleter() and u.get_deleter() after move construction reference the same value).unique_ptr by transferring ownership from u to *this, where u is constructed with a specified deleter (E). It depends upon whether E is a reference type, as following:E is a reference type, this deleter is copy constructed from u's deleter (requires that this construction does not throw),E is a non-reference type, this deleter is move constructed from u's deleter (requires that this construction does not throw).pointer,Deleter is a reference type and E is the same type as Deleter, or Deleter is not a reference type and E is implicitly convertible to Deleter.-
Uis an array type, -
pointeris the same type aselement_type*, - unique_ptr<U,E>::pointer is the same type as unique_ptr<U,E>::element_type*,
- unique_ptr<U,E>::element_type(*)[] is convertible to
element_type(*)[], - either
Deleteris a reference type andEis the same type asDeleter, orDeleteris not a reference type andEis implicitly convertible toDeleter.
unique_ptr where the stored pointer is initialized with u.release() and the stored deleter is value-initialized. This constructor only participates in overload resolution if U* is implicitly convertible to T* and Deleter is the same type as std::default_delete <T>.Contents
[edit] Parameters
[edit] Notes
Instead of using the overload (2) together with new, it is often a better idea to use std::make_unique<T> .
(since C++14)std::unique_ptr <Derived> is implicitly convertible to std::unique_ptr <Base> through the overload (6) (because both the managed pointer and std::default_delete are implicitly convertible).
Because the default constructor is constexpr, static unique_ptrs are initialized as part of static non-local initialization, before any dynamic non-local initialization begins. This makes it safe to use a unique_ptr in a constructor of any static object.
There is no class template argument deduction from pointer type because it is impossible to distinguish a pointer obtained from array and non-array forms of new.
(since C++17)[edit] Example
#include <iostream> #include <memory> struct Foo // object to manage { Foo() { std::cout << "Foo ctor\n"; } Foo(const Foo&) { std::cout << "Foo copy ctor\n"; } Foo(Foo&&) { std::cout << "Foo move ctor\n"; } ~Foo() { std::cout << "~Foo dtor\n"; } }; struct D // deleter { D() {}; D(const D&) { std::cout << "D copy ctor\n"; } D(D&) { std::cout << "D non-const copy ctor\n"; } D(D&&) { std::cout << "D move ctor \n"; } void operator()(Foo* p) const { std::cout << "D is deleting a Foo\n"; delete p; }; }; int main() { std::cout << "Example constructor(1)...\n"; std::unique_ptr <Foo> up1; // up1 is empty std::unique_ptr <Foo> up1b(nullptr); // up1b is empty std::cout << "Example constructor(2)...\n"; { std::unique_ptr <Foo> up2(new Foo); //up2 now owns a Foo } // Foo deleted std::cout << "Example constructor(3)...\n"; D d; { // deleter type is not a reference std::unique_ptr <Foo, D> up3(new Foo, d); // deleter copied } { // deleter type is a reference std::unique_ptr <Foo, D&> up3b(new Foo, d); // up3b holds a reference to d } std::cout << "Example constructor(4)...\n"; { // deleter is not a reference std::unique_ptr <Foo, D> up4(new Foo, D()); // deleter moved } std::cout << "Example constructor(5)...\n"; { std::unique_ptr <Foo> up5a(new Foo); std::unique_ptr <Foo> up5b(std::move(up5a)); // ownership transfer } std::cout << "Example constructor(6)...\n"; { std::unique_ptr <Foo, D> up6a(new Foo, d); // D is copied std::unique_ptr <Foo, D> up6b(std::move(up6a)); // D is moved std::unique_ptr <Foo, D&> up6c(new Foo, d); // D is a reference std::unique_ptr <Foo, D> up6d(std::move(up6c)); // D is copied } #if (__cplusplus < 201703L) std::cout << "Example constructor(7)...\n"; { std::auto_ptr <Foo> up7a(new Foo); std::unique_ptr <Foo> up7b(std::move(up7a)); // ownership transfer } #endif std::cout << "Example array constructor...\n"; { std::unique_ptr <Foo[]> up(new Foo[3]); } // three Foo objects deleted }
Output:
Example constructor(1)... Example constructor(2)... Foo ctor ~Foo dtor Example constructor(3)... Foo ctor D copy ctor D is deleting a Foo ~Foo dtor Foo ctor D is deleting a Foo ~Foo dtor Example constructor(4)... Foo ctor D move ctor D is deleting a Foo ~Foo dtor Example constructor(5)... Foo ctor ~Foo dtor Example constructor(6)... Foo ctor D copy ctor D move ctor Foo ctor D non-const copy ctor D is deleting a Foo ~Foo dtor D is deleting a Foo ~Foo dtor Example constructor(7)... Foo ctor ~Foo dtor Example array constructor... Foo ctor Foo ctor Foo ctor ~Foo dtor ~Foo dtor ~Foo dtor
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2118 | C++11 | Constructors of unique_ptr<T[]> rejected qualification conversions.
|
Accept. |
| LWG 2520 | C++11 | unique_ptr<T[]> was accidentally made non-constructible from nullptr_t.
|
Made constructible. |
| LWG 2801 | C++11 | The default constructor was not constrained. | Constrained. |
| LWG 2899 | C++11 | The move constructor was not constrained. | Constrained. |
| LWG 2905 | C++11 | Constraint on the constructor from a pointer and a deleter was wrong. | Corrected. |
| LWG 2944 | C++11 | Some preconditions were accidentally dropped by LWG 2905 | Restored. |