Guardando 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();
};
}
Sebbene esista un costruttore di copie, prende un riferimento a non- const
. I temporanei non possono vincolare a questo, quindi al tipo viene effettivamente proibito di lavorare all'interno dei contenitori in qualsiasi luogo in cui vengono utilizzati i temporanei; inoltre, push_back
accetta un riferimento a const
, quindi a causa della correzione const
, è impossibile che il nuovo elemento interno venga copiato dall'argomento di push_back
.
(Quella pagina di Wikipedia dice che "a causa della sua semantica della copia, auto_ptr non può essere utilizzato nei contenitori STL che possono eseguire copie di elementi nelle loro operazioni"; ciò non significa che i contenitori esaminino magicamente il codice all'interno del costruttore di copie decidere se vuole fare il lavoro di tipo come un tipo di elemento. Invece, è solo circa la firma della funzione.)
in ogni caso, std::auto_ptr
è deprecato a partire dal C++ 11, perché, secondo il parere di alcuni, std::auto_ptr
è sciocco. Spiacente, std::auto_ptr
.
fonte
2011-09-09 09:10:49
So che non dovrei usare l'auto_ptr in stl a causa della copia semantica. Ma la mia domanda è ** come viene implementata la stl in modo che possa impedirti di farlo? ** Nel mio codice di esempio, non può nemmeno compilare. – frinker
Puoi pubblicare l'errore di compilazione? –
@xanatos: nessun costruttore di copia è 'const'! –