C++ 3d.Комментарии


auto_ptr


В стандартном заголовочном файле <memory> auto_ptr объявлен следующим образом...

Ввиду того, что после выхода первых (английских) тиражей стандарт претерпел некоторые изменения в части auto_ptr, концовку данного раздела следует заменить следующим текстом (он взят из списка авторских исправлений к 4 тиражу).

Для достижения данной семантики владения (также называемой семантикой разрушающего копирования (destructive copy semantics)), семантика копирования шаблона auto_ptr радикально отличается от семантики копирования обычных указателей: когда один auto_ptr копируется или присваивается другому, исходный auto_ptr очищается (эквивалентно присваиванию 0 указателю). Т.к. копирование auto_ptr приводит к его изменению, то const auto_ptr не может быть скопирован.

Шаблон auto_ptr определен в <memory> следующим образом: template<class X> class std::auto_ptr { // вспомогательный класс template <class Y> struct auto_ptr_ref { /* ... */ };

X* ptr; public: typedef X element_type;

explicit auto_ptr(X* p =0) throw() { ptr=p; } ~auto_ptr() throw() { delete ptr; }

// обратите внимание: конструкторы копирования и операторы // присваивания имеют неконстантные аргументы

// скопировать, потом a.ptr=0 auto_ptr(auto_ptr& a) throw();

// скопировать, потом a.ptr=0 template<class Y> auto_ptr(auto_ptr<Y>& a) throw();

// скопировать, потом a.ptr=0 auto_ptr& operator=(auto_ptr& a) throw();

// скопировать, потом a.ptr=0 template<class Y> auto_ptr& operator=(auto_ptr<Y>& a) throw();

X& operator*() const throw() { return *ptr; } X* operator->() const throw() { return ptr; }

// вернуть указатель X* get() const throw() { return ptr; }

// передать владение X* release() throw() { X* t = ptr; ptr=0; return t; }

void reset(X* p =0) throw() { if (p!=ptr) { delete ptr; ptr=p; } }

// скопировать из auto_ptr_ref auto_ptr(auto_ptr_ref<X>) throw();

// скопировать в auto_ptr_ref template<class Y> operator auto_ptr_ref<Y>() throw();




Начало  Назад  Вперед