Нет, это не так.
Вы забыли оператор присваивания.
Вы можете либо запретить назначение (странно, когда копирование разрешено), объявив оператор присваивания закрытым (а нереализации), или вы можете реализовать его следующим образом:
copy_ptr& operator=(copy_ptr const& rhs)
{
using std::swap;
copy_ptr tmp(rhs);
swap(this->item, tmp.item);
return *this;
}
Вы также забыли в конструкторе копирования, что other.item
может быть нулевым (как следствие конструктора по умолчанию), выберите свой вариант:
// 1. Remove the default constructor
// 2. Implement the default constructor as
copy_ptr(): item(new T()) {}
// 3. Implement the copy constructor as
copy_ptr(copy_ptr const& rhs): item(other.item ? new T(*other.item) : 0) {}
Для поведения, подобного значению, я бы предпочел 2
, поскольку значение не может быть нулевым.Если вы хотите разрешить нулевое значение, введите assert(item);
в operator->
и operator*
, чтобы обеспечить корректность (в режиме отладки), или сгенерируйте исключение (как хотите).
Наконец, item = 0
вдеструктор бесполезен: вы не можете использовать объект, если он все равно был уничтожен, не вызывая неопределенного поведения ...
Есть также замечание Роджера Пейта о распространении константности, которое должно быть более "ценностным", но это большедело семантики, чем правильности.