Search code examples
c++c++11move-semanticsunique-ptr

Is unique_ptr guaranteed to store nullptr after move?


Is unique_ptr guaranteed to store nullptr after move?

std::unique_ptr<int> p1{new int{23}};
std::unique_ptr<int> p2{std::move(p1)};
assert(!p1); // is this always true?

Solution

  • Yes, you can compare it to nullptr after the move and it is guaranteed to compare equal.

    From §20.8.1/4 [unique.ptr]

    Additionally, u can, upon request, transfer ownership to another unique pointer u2. Upon completion of such a transfer, the following postconditions hold:
    u2.p is equal to the pre-transfer u.p,
    u.p is equal to nullptr, and
    ...

    (the member p is described earlier as — a unique pointer is an object u that stores a pointer to a second object p)