Становится ли ссылка на строку невалидной после её мува?

На 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.

→ Ссылка