web-dev-qa-db-fra.com

Unique_ptr est-il garanti de stocker nullptr après le déplacement?

Est unique_ptr garanti pour stocker nullptr après le déménagement?

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

Oui, vous pouvez le comparer à nullptr après le move et il est garanti de comparer égal.

De §20.8.1/4 [unique.ptr]

De plus, u peut, sur demande, transférer la propriété à un autre pointeur unique u2. À l'issue d'un tel transfert, les conditions suivantes sont remplies:
- u2.p est égal au pré-transfert u.p,
- u.p est égal à nullptr, et
...

(le membre p est décrit plus haut comme - un pointeur unique est un objet u qui stocke un pointeur sur un deuxième objet p)

67
Praetorian

Oui. De la section standard C++ 2011 20.7.1/4:

De plus, u peut, sur demande, transférer la propriété vers un autre pointeur unique u2. À la fin d'un tel transfert, les postconditions suivantes détiennent [...] [la source unique_ptr] est égale à nullptr ...

10
Paul Evans