简体   繁体   中英

std::vector move assignment vs move construction: why is the state of 'other' not consistent?

For move construction:

After the move, other is guaranteed to be empty(). 1

For move assignment, the oft-quoted:

other is in a valid but unspecified state afterwards. 2

Why is the state of other different in these two cases?

There are 2 popular ways to implement move in containers like vector that internally hold a pointer to the data:

  • you can empty this, then copy the pointer (and size and capacity) from other to this and then set other members to nullptr/zero
  • you can swap the data members (the pointers, size and capacity).

The standard wants to leave leeway to implementations to do either. These guarantees are the strongest guarantees it can make while allowing either methods of implementation:

  • move constructor:

    • 1st method: leaves other in empty state
    • 2st method (swap): leaves other in empty state
  • move assignment:

    • 1st method: leaves other in empty state
    • 2st method (swap): leaves other as a copy of initial this

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM