Состояние объекта после std :: move - PullRequest
2 голосов
/ 24 декабря 2010

Допустимо ли в c ++ 0x оставлять объект перемещенным с целью создания перемещения в состоянии, которое может быть уничтожено только?Например:

class move_constructible {...};

int main()
{
    move_constructible x;
    move_constructible y(std::move(x));
    // From now on, x can only be destroyed. Any other method will result
    // in a fatal error.
}

Для записи я пытаюсь обернуть в структуру ac класса c ++ элемент указателя, который всегда должен указывать на некоторую выделенную область памяти.Все API библиотеки c опираются на это предположение.Но это требование не позволяет написать действительно дешевый конструктор перемещения, поскольку для того, чтобы x оставался действительным объектом после перемещения, ему потребуется собственная выделенная область памяти.Я написал деструктор таким образом, что он сначала проверит указатель NULL перед вызовом соответствующей функции очистки из API c, так что по крайней мере структура может быть безопасно разрушена после перемещения.

1 Ответ

3 голосов
/ 24 декабря 2010

Да, язык позволяет это.Фактически это было одной из целей семантики перемещения.Однако вы несете ответственность за то, чтобы другие методы не вызывались и / или не обеспечивали надлежащую диагностику.Обратите внимание, что обычно вы также можете использовать по крайней мере оператор присваивания, чтобы «оживить» вашу переменную, например, в классическом примере обмена двумя значениями.

См. Также этот вопрос

...