Во-первых, я бы избегал auto_ptr
Передача права собственности хороша в некоторых сценариях, но я считаю, что они редки, и «полноценные» библиотеки интеллектуальных указателей теперь легко доступны. (IIRC auto_ptr был компромиссом, включив хотя бы один пример в стандартную библиотеку, без задержек, которые потребовались бы для хорошей реализации).
См., Например, здесь
или здесь
Определить семантику
Должна ли копия foo содержать ссылку на тот же экземпляр bar? В этом случае используйте boost::shared_ptr
или (boost::intrusive_ptr
) или аналогичную библиотеку.
Или должна быть создана глубокая копия?
(Иногда это может потребоваться, например, при наличии состояния задержки). Я не знаю какой-либо стандартной реализации этой концепции, но не сложно построить ее, похожую на существующие умные указатели.
// roughly, incomplete, probably broken:
template <typename T>
class deep_copy_ptr
{
T * p;
public:
deep_copy_ptr() : p(0) {}
deep_copy_ptr(T * p_) : p(p_) {}
deep_copy_ptr(deep_copy_ptr<T> const & rhs)
{
p = rhs.p ? new T(*rhs.p) : 0;
}
deep_copy_ptr<T> & operator=(deep_copy_ptr<T> const & rhs)
{
if (p != rhs.p)
{
deep_copy_ptr<T> copy(rhs);
swap(copy);
}
}
// ...
}