Да, можно. Владельца unique_ptr можно изменить одним из следующих способов:
Передача владения с использованием std::move:
Новый unique_ptr может получить владение у существующего unique_ptr. При этом старый unique_ptr становится пустым (нулевым).
c
Сброс и присваивание:
Можно сбросить текущий unique_ptr (освободив владение и удалив объект), а затем присвоить ему либо новый объект, либо владение от другого unique_ptr (снова используя std::move).
c
Метод reset(pointer) также позволяет передать владение новым объектом или указателем из внешнего источника, при этом текущий объект освобождается.
c
Извлечение "сырого" указателя с помощью release():
Метод release() возвращает "сырой" указатель на объект, которым владеет unique_ptr, и при этом отказывается от владения. unique_ptr становится пустым. Затем этот "сырой" указатель может быть передан другому объекту, который примет владение, например, другому unique_ptr или ручному управлению памятью (с последующим delete). Важно: если полученный сырой указатель не будет передан объекту, который примет владение, возникнет утечка памяти.
c
Таким образом, unique_ptr гарантирует уникальное владение, но позволяет явным образом передать это владение из одного экземпляра в другой.