2014-10-29 3 views
1

Если временный Derived передан методу, который принимает Base&&, это нормально, чтобы переместить базу из этого?Можно ли перейти от ссылки r-значения к под-объекту временного?

+1

Это зависит от того, какой эффект перемещения-конструкции имеет ваш тип 'Base'. Если он покидает объект 'Derived' в допустимом состоянии, то да. В противном случае нет. –

+0

Мне кажется сомнительным, чтобы очистить под-объект. Удалось ли уничтожение объекта-объекта (в конце оценки выражения), с опущенным под-объектом? – haelix

+0

Если код построения перемещения, который вы написали для ваших типов, оставляет его в допустимом состоянии, тогда да. В противном случае нет. –

ответ

1

Временное время жизни продлевается до конца функции (или времени жизни параметра, соответственно), поэтому вы можете перемещать объект Base из этой ссылки.

Обратите внимание, что вам потребуется дополнительное std::move, чтобы сделать это движение, а не копия:

Base b = std::move(param); 

Временный объект при перемещении из оставляется в каком бы состоянии задается для перемещен-от объекта своего типа. Стандартные типы библиотек, такие как vector<int> или string, имеют так называемое «действительное, но неуказанное состояние» - в основном единственные разумные операции, которые вы можете выполнить, - это назначить (то есть скопировать или переместить в него) или уничтожить его. Без информации об определении конструктора перемещения Base 'никаких дополнительных предположений не может быть сделано.

+0

ОК, но я беспокоюсь не о жизни, а о состоянии, в котором остается полный объект. – haelix

+0

@haelix Расширеный ответ. Я все еще не совсем уверен, что вы, по сути, спрашиваете - что будет «хорошо»? – Columbo

+0

Назначение объекта также должно продолжаться. – Deduplicator