Конструктор перемещения и оператор присваивания перемещения выполняют только то, для чего они запрограммированы вами, программистом.Технически они могут быть спроектированы так, чтобы делать что угодно, но это не рекомендуется.
Скорее, они должны быть спроектированы так, чтобы сделать целевой объект неотличимым от исходного объекта, оставив исходный объект в допустимом состоянии.
ЕслиВы не предоставляете операцию перемещения самостоятельно, она будет синтезирована посредством перемещения по элементам.
Перемещение для основных типов, таких как int
, просто сделайте копию.
Перемещение для многих библиотечных типов, напримерпоскольку std::vector
, std::string
и std::unique_ptr
предназначены разработчиком библиотеки для передачи права собственности на ресурсы, такие как память.
Это означает, что для выделенного стека POD просто нетспособ избежать копирования.Если операция критична по производительности, а копия просто неприемлема, решение может состоять в том, чтобы не иметь выделенного в стеке POD, например, вставив объект в std::unique_ptr
.
Другой вариант можетбыть только когда-либо иметь целевой объект, и позволить другим "доступ" к этому объекту через указатели или ссылки.