Насколько я понимаю, C ++ не позволяет вам переместить ссылку. Другими словами, вы не можете изменить объект, на который ссылается ссылка. Это похоже на постоянный указатель в этом отношении (например, int* const a = 3;
).
В каком-то коде, который я посмотрел сегодня, я увидел следующее:
CMyObject& object = ObjectA().myObject();
// ...
object = ObjectB().myObject();
Сразу же прозвенели мои сигналы тревоги в последней строке кода выше. Разве код не пытался переназначить ссылку? И все же код скомпилирован.
Затем я понял, что код выполняет простой вызов оператора присваивания (т. Е. operator=
) для переназначения внутреннего объекта ObjectA
внутреннему объекту ObjectB
. Ссылка object
все еще ссылается на ObjectA
, просто содержимое ObjectA
теперь соответствует содержимому ObjectB
.
Насколько я понимаю, компилятор всегда будет генерировать оператор присваивания по умолчанию, если вы его не предоставите, что делает поверхностную копию (аналогично конструктору копирования по умолчанию).
Поскольку ссылка набирается (как и базовый объект, на который она ссылается), это не значит, что мы всегда будем вызывать оператор присваивания при попытке переназначить ссылку, тем самым предотвращая жалобу компилятора
Я ломал голову, пытаясь придумать недопустимую строку кода, которая неправильно попытается переместить ссылку, чтобы компилятор жаловался.
Может кто-нибудь указать мне пример такого кода?