Для обсуждения я предполагаю, что вы имеете в виду, что означает, что исходный объект «упал» (больше нет у него не было его деструктора), а не с двумя копиями (что приведет к гораздо большему количеству проблем, подсчет ссылок и т. д.). Я обычно ссылаюсь на свойство быть способным сделать это побитовым движением.
В основах кода, над которыми я работаю, большинство объектов побитообразно перемещаются, так как они не хранят ссылки на себя. Однако некоторые структуры данных не являются побитовыми (я считаю, что std :: set gcc не был побитовым, другие примеры были бы linked list nodes). В общем, я бы избегал попытки использовать это свойство, поскольку это может привести к очень тяжелому отладке ошибок и предпочтет объектно-ориентированные вызовы.
Edited добавить:
Там, кажется, некоторая путаница о том, как/почему кто-то хотел бы сделать это: вот комментарий, который я сделал на том, как:
Обычно, я вижу выше на альтернативных реализации вектора. Память выделяется через malloc (sizeof (Class) * size), а объекты построены на месте через явно называемые конструкторы и деструкторы. Иногда (например, при перераспределения), они должны быть перемещены, поэтому вариант сделать повторного призыв StD :: вектора по конструкторам копирования на новой памяти и деструкторы на старые, или использовать memcopy и просто «бесплатно» старый блок. В большинстве случаев последний просто «работает», но не для всех объектов.
Что касается причин, то подход memcopy (или realloc) может быть значительно быстрее.
Да, оно вызывает неопределенное поведение, но оно также просто работает для большинства объектов. Некоторые считают, что скорость стоит того. Если бы вы были действительно настроены на использование этого подхода, я бы предложил реализовать свойство bitwise_movable типа, чтобы разрешить типы, которые работают для белого, и вернуться к традиционной копии для объектов, не входящих в белый список, подобно примеру here.
Я когда-то реализовал контейнер (http://www.spotep.com/dev/devector.h), где я думал об одном и том же, и все же я не нашел один класс, который не мог быть «перемещен». Единственные случаи, о которых я мог подумать, - это если какой-то класс регистрирует свое собственное местоположение памяти каким-то странным образом или состоит из указателя, указывающего на себя. Я слышал, что существуют реализаторы std :: string, которые могут указывать либо на себя, либо на кучу, но я действительно не видел его. –
Список с двойной памятью с двойной памятью будет разваливаться, если он переместится. Трюк XOR-ing указателя в узле с адресом узла, из которого вы пришли, не будет работать. – Novelocrat
@Victor: В сценарии MI с виртуальным базовым классом это может завершиться неудачно, если среда выполнения хранит ссылку на виртуальную базу как указатель вместо смещения. – sbi