Empty State of Moved-From Vectors
In C standard library types, moved-from objects are generally placed in a valid but unspecified state. However, there is curiosity around whether vectors explicitly fall under this rule.
Move Constructor Behavior
For vector's move constructor, the moved-from vector is consistently empty due to the requirement of constant complexity. The constructor steals resources from the source vector to construct the new instance, leaving the original vector in an empty state.
Move Assignment Operator Behavior
The behavior of vector's move assignment operator is more nuanced and depends on the allocator:
Case 1: Propagate Move Assignment = True
In this case, the moved-from vector will always be empty. The assignment operator destroys elements, deallocates capacity, transfers ownership of the memory buffer from the source vector, and moves the allocators. This leaves the original vector in an empty state.
Case 2: Propagate Move Assignment = False, Equal Allocators
Similar to Case 1, the moved-from vector is emptied by the move assignment operator. The allocators are not moved, and the case distinction occurs dynamically.
Case 3: Propagate Move Assignment = False, Unequal Allocators
The most intricate case involves different allocators. Here, the move assignment can't move resources or assign allocators. Instead, it moves individual elements from the source vector to the destination vector. Depending on allocator capabilities and element construction requirements, the moved-from vector may not necessarily be empty. However, some implementations may choose to explicitly call clear() on the source vector, leaving it empty.
The above is the detailed content of What is the State of a Moved-From Vector in C ?. For more information, please follow other related articles on the PHP Chinese website!