Становится ли ссылка на строку невалидной после её мува?
На cppreference написано, что после move assignment строки ссылки на неё становятся невалидными. Правда ли это? Или всё таки имелось в виду, что ссылки на внутренние элементы строки типа str.c_str() стали другими?
auto& s3 = s1;
s2 = std::move(s1);
// is s3 still valid?
Ответы (1 шт):
Перемещённый объект (после move assignment) остаётся в валидном, но неизвестном состоянии (см. ответ). Т.о. ссылка s3 валидна и указывает на тот же объект s1. Но сам объект s1 уже может быть изменён.
Написанное на cppreference:
Replaces the contents with those of str using SequenceContainer's move assignment semantics. Unlike other sequence container move assignments, references, pointers, and iterators to elements of str may be invalidated.
относится к элементам строки, по аналогии с элементами последовательного контейнера, если строку рассматривать как контейнер символов.
Потенциальная дополнительная инвалидация итераторов, указателей и ссылок (на элементы строки) обусловлена вероятным использованием short string optimization.