Это в случае, если вы можете неявно конвертировать указатели:
struct base {};
struct derived : base {};
std::auto_ptr<derived> d(new derived);
std::auto_ptr<base> b(d); // converts
Кроме того, вы не спрашивали, но заметили, что конструктор копирования не является const. Это потому, что auto_ptr
станет владельцем указателя. В приведенном выше примере после построения b
, d
ничего не удерживается. Это делает auto_ptr
непригодным для использования в контейнерах, потому что его нельзя скопировать.
C ++ 0x рвов auto_ptr
и делает один с именем unique_ptr
. Этот указатель имеет те же цели, но выполняет их правильно из-за семантики перемещения. То есть, хотя его нельзя скопировать, он может «переместить» владельца:
std::unique_ptr<derived> d(new derived);
std::unique_ptr<base> b(d); // nope, cannot be copied
std::unique_ptr<base> b(std::move(d)); // but can be moved
Это делает unique_ptr
пригодным для использования в контейнерах, потому что они больше не копируют свои значения, они перемещают их.