Возможный дубликат:
Как можно использовать перемещенные объекты?
Что представляет собой допустимое состояние для «перемещенного объекта» в C ++ 11?
При реализации семантики перемещения в C ++ 11 следует ли оставить перемещенный объект в безопасный состояние, или его можно просто оставить в «мусорном» состоянии?
например Что является предпочтительным вариантом для реализации конструктора перемещения в следующем примере оболочки C ++ 11 в необработанном виде FILE*
ресурс?
// C++11 wrapper to raw FILE*
class File
{
FILE* m_fp;
public:
// Option #1
File(File&& other)
: m_fp(other.m_fp)
{
// "other" left in a "junk" state
}
// Option #2
File(File&& other)
: m_fp(other.m_fp)
{
// Avoid dangling reference in "other"other.m_fp = nullptr;
}
...
};
Единственное, что вы должен быть в состоянии сделать с перемещенным объектом — уничтожить его. Кроме того, ваш класс должен решать, что представляют собой обычные инварианты класса и будут ли объекты, перемещенные из них, удовлетворять их.
Например, это хорошая идея, чтобы убедиться, что вы можете назначить объект, на тот случай, если кто-то хочет использовать std::move
на экземпляр и дать ему новое значение позже. [Редактировать: как указано в ответе на один из предложенных вопросов, общий std::swap
шаблон перемещается из объекта, а затем перемещается и назначается ему, поэтому, если вы этого не гарантируете, то либо вам нужно специализироваться std::swap
или вам нужно запретить пользователям вашего класса использовать его.]
Так как ваш класс ничего не делает в своем деструкторе, любой из вариантов подойдет. Вариант 2 может быть проще для пользователей, но с другой стороны, если они кодируют, исходя из предположения, что они ничего не могут сделать с перемещенным объектом, то это не имеет значения. Поскольку класс неполон, он может измениться, когда вы напишите деструктор.
Объект, который был перемещен, все еще является объектом, и он должен находиться в действительный состояние, хотя это может быть неопределенный. В частности, должно быть возможно назначать новое значение для него безопасно (и, конечно, оно должно быть разрушаемым, как говорит @Steve). Какую семантику вы хотите дать своему классу, зависит от вас, если только перемещенный объект остается действительным.
В общем, вы должны думать о «перемещении» как о оптимизированной «копии». Тем не менее, для некоторых классов, которые по сути «только для перемещения», такие как unique_ptr
могут потребоваться дополнительные гарантии — например, unique_ptr
обещает, что после того, как оно было удалено, оно становится пустым, и, конечно, ничто другое не имеет смысла.
(Ваш фактический код неполный, но, учитывая, что FILE*
это ресурс типа «только для перемещения», он, вероятно, не работает, и вы должны попытаться эмулировать unique_ptr
как можно ближе — или даже использовать его напрямую.)