Глядя на определение 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();
};
}
Хотя существует конструктор копирования, он принимает ссылку на non- const
. Временные могут не связываться с этим, поэтому типу фактически запрещено работать внутри контейнеров в любом месте, где используются временные; кроме того, push_back
принимает ссылку на const
, поэтому из-за правильности const
новый внутренний элемент не может быть создан путем копирования из аргумента push_back
.
(Эта страница в Википедии гласит, что «из-за своей семантики копирования auto_ptr не может использоваться в контейнерах STL, которые могут выполнять копирование элементов в своих операциях»; это не означает, что контейнеры волшебным образом проверяют код внутри конструктора копирования для решить, хочет ли он заставить тип работать как тип элемента. Вместо этого речь идет только о сигнатуре функции.)
В любом случае, std::auto_ptr
устарела с C ++ 11, потому что, по мнению некоторых, std::auto_ptr
глупо. Извините, std::auto_ptr
.