Если временный Derived
передан методу, который принимает Base&&
, это нормально, чтобы переместить базу из этого?Можно ли перейти от ссылки r-значения к под-объекту временного?
ответ
Временное время жизни продлевается до конца функции (или времени жизни параметра, соответственно), поэтому вы можете перемещать объект Base
из этой ссылки.
Обратите внимание, что вам потребуется дополнительное std::move
, чтобы сделать это движение, а не копия:
Base b = std::move(param);
Временный объект при перемещении из оставляется в каком бы состоянии задается для перемещен-от объекта своего типа. Стандартные типы библиотек, такие как vector<int>
или string
, имеют так называемое «действительное, но неуказанное состояние» - в основном единственные разумные операции, которые вы можете выполнить, - это назначить (то есть скопировать или переместить в него) или уничтожить его. Без информации об определении конструктора перемещения Base
'никаких дополнительных предположений не может быть сделано.
ОК, но я беспокоюсь не о жизни, а о состоянии, в котором остается полный объект. – haelix
@haelix Расширеный ответ. Я все еще не совсем уверен, что вы, по сути, спрашиваете - что будет «хорошо»? – Columbo
Назначение объекта также должно продолжаться. – Deduplicator
Это зависит от того, какой эффект перемещения-конструкции имеет ваш тип 'Base'. Если он покидает объект 'Derived' в допустимом состоянии, то да. В противном случае нет. –
Мне кажется сомнительным, чтобы очистить под-объект. Удалось ли уничтожение объекта-объекта (в конце оценки выражения), с опущенным под-объектом? – haelix
Если код построения перемещения, который вы написали для ваших типов, оставляет его в допустимом состоянии, тогда да. В противном случае нет. –