Почему интерфейс для auto_ptr определяет два конструктора, похожих на конструктор копирования - PullRequest
3 голосов
/ 23 января 2010

Я просматривал документацию auto_ptr по этой ссылке auto_ptr Есть кое-что, что я не мог полностью понять, почему это сделано. В разделе интерфейса есть два объявления для его конструктора копирования

1)

auto_ptr(auto_ptr<X>&) throw (); 

2)

template <class Y> 
     auto_ptr(auto_ptr<Y>&) throw(); 

Для чего это нужно.

Ответы [ 2 ]

5 голосов
/ 23 января 2010

Первый является конструктором копирования, затем второй является шаблонным конструктором из auto_ptr с другими параметрами шаблона.

Реализация должна предоставлять не шаблонный конструктор копирования, если он не хочет, чтобы компилятор генерировал его. Это связано с тем, что шаблонный конструктор, который можно использовать в качестве конструктора копирования, не подавляет генерируемый им компилятором, а генерируемый компилятором всегда будет лучше соответствовать конструкции копирования, поскольку он не является шаблоном.

5 голосов
/ 23 января 2010

Это в случае, если вы можете неявно конвертировать указатели:

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 пригодным для использования в контейнерах, потому что они больше не копируют свои значения, они перемещают их.

...