En cuanto a the definition of std::auto_ptr
:
namespace std {
template <class Y> struct auto_ptr_ref {};
template <class X>
class auto_ptr {
public:
typedef X element_type;
// 20.4.5.1 construct/copy/destroy:
explicit auto_ptr(X* p =0) throw();
auto_ptr(auto_ptr&) throw();
template <class Y> auto_ptr(auto_ptr<Y>&) throw();
auto_ptr& operator=(auto_ptr&) throw();
template <class Y> auto_ptr& operator=(auto_ptr<Y>&) throw();
auto_ptr& operator=(auto_ptr_ref<X>) throw();
~auto_ptr() throw();
// 20.4.5.2 members:
X& operator*() const throw();
X* operator->() const throw();
X* get() const throw();
X* release() throw();
void reset(X* p =0) throw();
// 20.4.5.3 conversions:
auto_ptr(auto_ptr_ref<X>) throw();
template <class Y> operator auto_ptr_ref<Y>() throw();
template <class Y> operator auto_ptr<Y>() throw();
};
}
Aunque hay un constructor de copia, toma como referencia no const
. Es posible que los temporarios no se vinculen a esto, por lo que se prohíbe efectivamente que el tipo funcione dentro de los contenedores en cualquier lugar donde se usen los temporales; Además, push_back
acepta una referencia a const
, por lo que debido a const
-corrección es imposible para el nuevo elemento interno copiar-construido del argumento push_back
.
(Esa página de Wikipedia dice que "debido a su semántica de copia, auto_ptr no puede usarse en contenedores STL que pueden realizar copias de elementos en sus operaciones", esto no significa que los contenedores examinen mágicamente el código dentro del constructor de copias para decidir si quiere hacer el trabajo de tipo como un tipo de elemento. en su lugar, se trata sólo de la firma de la función.)
de todos modos, std::auto_ptr
está obsoleta de C++ 11, ya que, en opinión de algunos, std::auto_ptr
es tonto. Lo siento, std::auto_ptr
.
Sé que no debería usar el auto_ptr en stl debido a la semántica de copia. Pero mi pregunta es ** ¿cómo se implementa el stl para que pueda prohibirte hacerlo? ** En mi código de muestra, ni siquiera puede compilar. – frinker
¿Puedes publicar el error de compilación? –
@xanatos: ¡Ningún constructor de copia es 'const'! –