Если перемещенный объект оставить в «безопасном» месте? государство?

Возможный дубликат:
Как можно использовать перемещенные объекты?
Что представляет собой допустимое состояние для «перемещенного объекта» в 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;
}

...
};

8

Решение

Единственное, что вы должен быть в состоянии сделать с перемещенным объектом — уничтожить его. Кроме того, ваш класс должен решать, что представляют собой обычные инварианты класса и будут ли объекты, перемещенные из них, удовлетворять их.

Например, это хорошая идея, чтобы убедиться, что вы можете назначить объект, на тот случай, если кто-то хочет использовать std::move на экземпляр и дать ему новое значение позже. [Редактировать: как указано в ответе на один из предложенных вопросов, общий std::swap шаблон перемещается из объекта, а затем перемещается и назначается ему, поэтому, если вы этого не гарантируете, то либо вам нужно специализироваться std::swap или вам нужно запретить пользователям вашего класса использовать его.]

Так как ваш класс ничего не делает в своем деструкторе, любой из вариантов подойдет. Вариант 2 может быть проще для пользователей, но с другой стороны, если они кодируют, исходя из предположения, что они ничего не могут сделать с перемещенным объектом, то это не имеет значения. Поскольку класс неполон, он может измениться, когда вы напишите деструктор.

6

Другие решения

Объект, который был перемещен, все еще является объектом, и он должен находиться в действительный состояние, хотя это может быть неопределенный. В частности, должно быть возможно назначать новое значение для него безопасно (и, конечно, оно должно быть разрушаемым, как говорит @Steve). Какую семантику вы хотите дать своему классу, зависит от вас, если только перемещенный объект остается действительным.

В общем, вы должны думать о «перемещении» как о оптимизированной «копии». Тем не менее, для некоторых классов, которые по сути «только для перемещения», такие как unique_ptrмогут потребоваться дополнительные гарантии — например, unique_ptr обещает, что после того, как оно было удалено, оно становится пустым, и, конечно, ничто другое не имеет смысла.

(Ваш фактический код неполный, но, учитывая, что FILE* это ресурс типа «только для перемещения», он, вероятно, не работает, и вы должны попытаться эмулировать unique_ptr как можно ближе — или даже использовать его напрямую.)

6

По вопросам рекламы [email protected]