Am Mo., 1. Juli 2024 um 17:33 Uhr schrieb Yongwei Wu via
Std-Discussion <std-discussion@lists.isocpp.org>:
>
> On this page <URL:https://en.cppreference.com/w/cpp/container/vector/vector>,
> I saw the wording "Move constructor. Constructs the container with the
> contents of other using move semantics.... After the move, other is
> guaranteed to be empty()."
>
> Does the standard really provide this empty() guarantee (for vector,
> or any other containers)? I cannot find it. I only see the general
> specification that a moved-from object is in a valid but unspecified
> state.
>
> (If it does not provide this guarantee, should it?)
The wording doesn't say that the post-condition is an empty state, but
it has the requirement for all sequence containers (except for
std::array) that the move operation has a constant complexity. This
more or less implies an empty state for std::vector, since the
"more or less" - yes.
There is only one reasonable way to implement the move constructor for std::vector, and it will leave the source object empty.
One can imagine a deliberately hostile implementation of the move constructor, which works like this: first, the destination object steals the buffer from the source object. Then, only for a trivially copyable type such as `int`, the source object attempts to allocate a new buffer and construct some elements into it. If the allocation fails, the exception is swallowed and the source object is left empty. If the allocation succeeds, we have a non-empty source object and the implementation hasn't violated any of the rules in the standard.
move-target will typically just "steal" the guts from the move-source.
Since you have the valid-but-unspecified guarantee you can call every
function without preconditions (Such as size() or capacity()) and
inspect the actual situation, if that would be relevant for you.
Thanks,
- Daniel
--
Std-Discussion mailing list
Std-Discussion@lists.isocpp.org
https://lists.isocpp.org/mailman/listinfo.cgi/std-discussion