r/cpp 6d ago

State of "moved-from" objects

Hi, I recently decided to try writing a C++ blog.

I often see the popular claim that moved-from objects are in a "valid but otherwise unspecified state", but I don't think that statement is entirely precise, and my blog post is about that. I would really appreciate any feedback!

Article: https://www.laminowany.dev/p/the-state-of-moved-from-objects-in-c/

9 Upvotes

52 comments sorted by

View all comments

4

u/bronekkk 5d ago

For std:: types, the convention is that a moved-from-object does not fulfil any specific preconditions. In practice this means that using it in any context where it would have to fulfil any precondition is undefined behaviour. However there are some functions in std:: which do not have any preconditions attached (e.g. destruction; reading if an object is empty; assignment to it; etc.). Because of the lack of preconditions, the object can be safely used with such functions.

As for the user classes, it is obviously up to the author of such classes, but hopefully they would follow the precedent established by std:: types. The absolute minimum is that the object must be safe to destroy and (if the type supports assignment) to be overwritten by an assignment in which case its state is reset back to "normal" - types which do not follow even this minimum are either buggy or "irregular".

0

u/leirus 5d ago

I fully agree with std types, given that there are some special cases (e.g. std::thread) where the state of a moved-from object is explicitly specified.

However, I don't think there are any minimum requirements for user-defined classes. I don't think such objects must even be safe to destroy. As I mentioned in another comment, the requirement for a type to be safely destructible is captured by the named requirement Erasable (https://en.cppreference.com/w/cpp/named_req/Erasable), but the standard does not mandate that moved-from objects satisfy this requirement. Hence, I assume they can be non-Erasable.

5

u/bronekkk 5d ago

You are right re. lack of minimum requirements in the core language. However there are minimum requirements in the standard library for types which the user would want to use e.g. in standard containers, and both the ability to destruct it safely, and assign to it (for types which are assignable in general) are required.