Я не понимаю, может ли назначение перемещения свободно / свободно изменить адрес переменной x и лишить законной силы все хранения указателей и ссылок &Икс.
Я полагаю, что это ложно, потому что назначение перемещения по умолчанию перемещает каждого члена и сохраняет указатель this, но гарантировано ли это?
РЕДАКТИРОВАТЬ: Пример
int x(1), y(2);
int& ref(x);
x = std::move(y);
// ref still valid ?
Перемещение к или от объекта не делает недействительными ссылки или указатели на объект. Адрес обоих объектов остается прежним.
Ссылки — это просто альтернативные имена существующим объектам. То есть, x
а также ref
полностью взаимозаменяемы (хотя я не уверен, если decltype(x)
а также decltype(ref)
идентичны): когда x
изменяется с использованием другого имени ref
соответственно увидим то же самое изменение. Точно так же наоборот. То же самое относится и к указателям на объекты.
Аннулирование ссылок и указателей происходит, когда указанная сущность как-то исчезает. Например, когда у вас есть ссылка на элемент в std::vector<T>
и емкость вектора изменяется, ссылка становится недействительной, потому что базовый объект удаляется.
Конечно, для вашего примера int
с помощью std::move(y)
в любом случае довольно бессмысленно: встроенные типы на самом деле не имеют конструкторов перемещения, т. е. эквивалентны копии. Однако даже при использовании типа класса объект и ссылка на него все равно ссылаются на один и тот же объект.